Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查找每个类别中的最后一行_Sql_Sybase - Fatal编程技术网

Sql 查找每个类别中的最后一行

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

我使用的是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行。

这是一种方法:

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这里有两个答案。。因此,您可以同时运行这两个选项,并查看哪一个选项有效,如果两个选项都有效,则检查解释计划…:谢谢,这就是我要找的。