我正在使用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
。
答案 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
答案 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
/