Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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_Sql Server_Tsql - Fatal编程技术网

Sql 如何基于多个列的聚合返回单行

Sql 如何基于多个列的聚合返回单行,sql,sql-server,tsql,Sql,Sql Server,Tsql,很抱歉标题不明确,不确定如何搜索,或询问此问题 假设我们有一个表: RowID FkId Rank Date ID1 A 1 2013-3-1 ID2 A 2 2013-3-2 ID3 A 2 2013-3-3 ID4 B 3

很抱歉标题不明确,不确定如何搜索,或询问此问题

假设我们有一个表:

RowID FkId Rank Date ID1 A 1 2013-3-1 ID2 A 2 2013-3-2 ID3 A 2 2013-3-3 ID4 B 3 2013-3-4 ID5 A 1 2013-3-5 我需要创建一个视图,该视图将为每个FkId返回一行。该行应为最大秩和最大日期。因此,对于FKIDA,查询将返回ID3的行

我能够通过使用子查询返回一行;首先,我获取MAXRank,然后连接到另一个查询,该查询通过FkId&Rank获取MAXDate组

SELECT TableA.* (Select FkId, MAX(Rank) AS Rank FROM TableA GROUP BY FkId) s1 INNER JOIN (Select FkId, Rank, MAX(Date) AS Date FROM TableA GROUP BY FkId,Rank) s2 ON s1.FkId = s2.FkId AND s1.Rank = s2.Rank INNER JOIN TableA ON s2.FkId = TableA.FkId AND s2.Rank = TableA.Rank AND s2.Date = TableA.Date 是否有更高效的查询可以获得相同的结果?谢谢你的关注


编辑:自上次回答后添加了ID5。如果我尝试一个普通的MAXrank,MAXDate组FkId,那么对于a,我会得到a;2.2013-3-5. 此结果与RowId不匹配。

此答案评论中澄清的问题要求:

每个FkId对应一行 最大日期和等级 结果将与原始数据中的一行相对应。 如果FKID中有行,使得最大日期和最大秩位于单独的行中,则必须至少放宽其中一个要求

如果您愿意放宽要求3,则可以使用:

考虑到评论中的额外信息。如果您想要每个FkId的排名最高的条目中的最新条目,则以下操作应有效:

SELECT FkId, Rank, MAX(Date) AS Date
FROM TableA A
WHERE Rank = (SELECT MAX(Rank) 
              FROM TableA sub 
              WHERE A.FkId = sub.FkId 
              GROUP BY sub.FkId)
GROUP BY FkId, Rank
这里有一个。

可以与假定的sql server>=2005一起使用:

WITH CTE AS
(
   SELECT TableA.*,
      RN = ROW_NUMBER() OVER (PARTITION BY FkId Order By Rank Desc, Date DESC)
   FROM Table A
)
SELECT RowID,FkId, Rank,Date
FROM CTE WHERE RN = 1

您可以使用排名和内联查询来实现它


select * from TableA
where RowID in (
      select rowID from (
           select FKID, RowID, 
                  rank() over (partition by FKID order by [Rank] desc, [Date] desc) as RankNumber
                  from TableA ) A
      where A.RankNumber=1 ) 

你也可以偷偷摸摸地完成ljh的建议:


秩的数据类型是什么?从所有具有最大秩的行中选择具有最大日期的行?或者从所有具有最大日期的行中选择具有最大秩的行?这两个可能不同@AaronKurtzhals:numericsqlfiddle处理一些数据:MAXRank和MaxDate可能不在同一行!但如果ID1的日期是2013-3-5呢?此查询返回一个;2.2013年3月5日,这和罗维德不相称。这是一个公平的批评。我想我会反驳你,你认为在那种情况下会发生什么?两行都要还是两行都不要?我编辑了我的答案,以澄清它的局限性和问题的范围。我的目标是将我的结果降到单个FkId的单个RowId。我的用户可以添加任意多的子行。当它们输入一行时,它们指定项目的排名。保存时,我给行加上时间戳。我的报告需要获得最高级别的子行。如果有行具有相同的排名,那么我按输入的最后一行进行。好的,经过几次编辑后,我想我有了一些东西,可以满足您的需要。+1。窗口功能非常棒。如果可能有两行或更多行具有相同的FkId、RANK和Date,您也可以使用RANK代替ROW_NUMBER。@ypercube:如果我想要所有最大行,我会在这里使用密集的RANKworks,因为第一个位置没有间隙,但OP说他想要…返回一行。是的,但他没有告诉我们保证只有一条。@TimSchmelter:我的视图是多行的,但每个FkId只有一行。@csthopper:如果使用行号,即使有两条记录具有相同的FkId,秩+日期,也会得到一条记录。

select * from TableA
where RowID in (
      select rowID from (
           select FKID, RowID, 
                  rank() over (partition by FKID order by [Rank] desc, [Date] desc) as RankNumber
                  from TableA ) A
      where A.RankNumber=1 ) 
select top 1 with ties *
from TableA
order by rank() over (
  partition by FKID
  order by [Rank] desc, [Date] desc
)