Sql 查找每个类别中的最后一行
我使用的是Sybase,它不支持人们在这里使用的很多很酷的功能。所以,在帮助我的时候请记住这一点 我有一个db,看起来像这样: 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等 我想根据按升序排列的时间从每个类别中提取最后一行。因此,对于上面给定的表,我想提取第5行。这是一种方法:Sql 查找每个类别中的最后一行,sql,sybase,Sql,Sybase,我使用的是Sybase,它不支持人们在这里使用的很多很酷的功能。所以,在帮助我的时候请记住这一点 我有一个db,看起来像这样: Type RowTime Quantity cat1 1 10:01:01.000 50 cat1 2 10:01.01.001 0 cat1 3 10:01:01.002 1000
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
这是一种方式:
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
在查看了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
从这里获得秩函数:
查看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
从这里获得秩函数:
两个Oracle查询可能会给您一些想法。我不确定这些分析函数在Sybase中是否可用。基本上,您需要按类别对查询进行分区,然后获取该类别中的最后一行—在您的情况下可能是MAXrow\u time。许多解析函数可用于此:行数、秩、密秩
-- 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
/
几个Oracle查询可能会给您一些想法。我不确定这些分析函数在Sybase中是否可用。基本上,您需要按类别对查询进行分区,然后获取该类别中的最后一行—在您的情况下可能是MAXrow\u time。许多解析函数可用于此:行数、秩、密秩
-- 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
/
从表名称中选择*
按类型分组
让RowTime=maxRowTime从表名称中选择*
按类型分组
让RowTime=maxRowTime我的桌子很大,这是最有效的方法吗?我的桌子很大,这是最有效的方法吗?@user1949158这里有两个答案。。因此,您可以同时运行这两个选项,并查看哪一个选项有效,如果两个选项都有效,则检查解释计划…:谢谢,这就是我要找的。@user1949158这里有两个答案。。因此,您可以同时运行这两个选项,并查看哪一个选项有效,如果两个选项都有效,则检查解释计划…:谢谢,这就是我要找的。