查找每个类别的最后一行

时间:2013-01-11 20:59:49

标签: sql sybase

我正在使用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 个答案:

答案 0 :(得分: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

从这里获得排名功能: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc00169.1270/html/iqperf/CEGDJFCE.htm

答案 1 :(得分: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

答案 2 :(得分:1)

SELECT * FROM table_name GROUP BY类型 具有RowTime = max(RowTime)

答案 3 :(得分: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
/