2013-01-11 53 views
1

我正在使用Sybase,它不支持很多人在此使用的很酷的功能。所以,請在幫助我的時候記住這一點。查找每個類別中的最後一行

我有一個數據庫,看起來是這樣的:

 
Type   RowTime    Quantity   
cat1 1  10:01:01.000  50   
cat1 2  10:01.01.001  0   
cat1 3  10:01:01.002  1000   
cat1 4  10:01.01.003  100   
cat1 5  10:01:03.001  100   

除了有CAT2,CAT3,CAT4等爲好。

我想找到摘自基於分佈在ascending order時間每個類別的最後一排。所以,對於上面給出的表格,我想提取row 5

回答

4

考慮看看Sybase文檔後,好像你有一個等級的功能。所以這裏有一個刺在它:

declare @table table (tp varchar(30), rowtime datetime, quantity int) 

insert @table select 'cat1 1', '20120101', 50 
insert @table select 'cat2 1', '20130101', 50 
insert @table select 'cat3 1', '20110101', 50 
insert @table select 'cat4 1', '20100101', 50 
insert @table select 'cat5 1', '20090101', 50 
select * from (
    select *, RANK() OVER (ORDER BY RowTime DESC) AS Rank from @table 
) a 
where [RANK]=1 

從這裏得到了RANK函數: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc00169.1270/html/iqperf/CEGDJFCE.htm

+1

@ user1949158這裏有兩個答案..所以你可以運行兩個,看看哪一個工作,如果兩個工程,然後你檢查'解釋'計劃...... :) – bonCodigo

+0

感謝這就是我一直在尋找。 – Zanam

2

這是一種方式:

SELECT A.* 
FROM YourTable A 
INNER JOIN (SELECT Type, MAX(Time) MaxTime 
      FROM YourTable 
      GROUP BY Type) B 
    ON A.Type = B.Type AND A.Time = B.MaxTime 
+0

我桌子很大,這是做這件事最有效的方法嗎? – Zanam

0

夫婦,可能會給你一些想法的Oracle查詢。我不確定這些分析函數是否可用於Sybase。基本上你需要按類別對查詢進行分區,然後得到該分類中的最後一行 - 可能是MAX(row_time)。可使用許多分析功能是:ROW_NUMBER(),RANK(),DENSE_RANK()...

-- Selects sal within dept with Rank = 2 -- 
SELECT ename, sal, sal_rank 
    FROM (SELECT ename, sal, DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal ASC) sal_rank FROM scott.emp) 
WHERE sal_rank <= 2 
/

-- MIN/MAX sal in each dept -- 
SELECT empno, deptno, sal, 
    MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) "Lowest", 
    MAX(sal) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) "Highest" 
FROM scott.emp 
ORDER BY deptno, sal 
/
1

SELECT * FROM TABLE_NAME GROUP BY 類型的具有RowTime = MAX(RowTime)

相關問題