【问题标题】:Query to Return Top Items for Each Distinct Column Value查询以返回每个不同列值的顶部项目
【发布时间】:2012-08-15 09:16:17
【问题描述】:

如果我有一个包含以下字段的表格

ID, SomeFK, SomeTime

我将如何编写查询以返回每个 SomeFK 的最新/前 3 项(基于 SomeTime)。

所以,结果可能看起来像

SomeFK    Sometime
0         2012-07-05 
0         2012-07-04 
0         2012-07-03 
1         2012-07-03 
1         2012-07-02 
1         2012-07-01 
2         2012-07-03 
2         2012-07-02 
2         2012-07-01 
....etc....

返回特定SomeFK 的最新项目很容易,但我只是想不出如何为上述内容执行此操作。我也觉得应该很简单!

编辑:

抱歉,我错过了一些关键信息。这是针对SQL2000的,所以ROW_NUMBER()不能用!

【问题讨论】:

  • 请参阅此处的"solution based on concatenation" 部分,了解一种适用于 2000 年的方法。
  • @MartinSmith 你能在 2000 年使用 CTE 吗?
  • @podiluska - 不,它们仅适用于 2005 年以上。不过,您可以使用派生表。实际上刚刚意识到较早的链接不适合,因为仅适用于 N=1。 Another 2000 method is here
  • 最后一个链接对我有用。

标签: sql sql-server sql-server-2000 greatest-n-per-group


【解决方案1】:
SELECT SomeFk, SomeTime 
FROM 
    (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY SomeFK ORDER BY sometime desc) rn
    FROM yourtable
    ) v
WHERE rn<=3
ORDER BY somefk, rn

对于 SQL 2000,我建议升级到受支持的平台。

但如果你坚持的话。

select *
from yourtable t1
where
    (select COUNT(*)
     from yourtable
     where somefk = t1.somefk
     and sometime>=t1.sometime
    ) <=3

【讨论】:

  • 抱歉,我遗漏了一些关键信息。这是针对SQL2000的,所以不能使用ROW_NUMBER()!
  • 我已经接受这是最好的解决方案。我会在末尾添加以下警告:and sometime is not null order by somefk, sometime desc
【解决方案2】:

我想我理解你的正确,你能不能不要选择max SomeTime 然后分组,像这样:

select SomeFK, max(SomeTime) 
from Table
group by SomeFK

我在这里可能不正确,因为我不完全确定您所说的最新是什么意思。

【讨论】:

  • 最新,我的意思是“按时间排名前列”。这个例子应该澄清
【解决方案3】:

基于this link(作为对原始问题的评论提供)。一种解决方案是:

SELECT DISTINCT ID, SomeFK, SomeTime
FROM SomeTable t1
WHERE ID IN (SELECT TOP 3 ID
               FROM SomeTable t2
              WHERE t2.SomeFK= t1.SomeFK
              ORDER BY SomeTime DESC)
ORDER BY SomeFK, SomeTime DESC

虽然我现在更喜欢接受的解决方案。

【讨论】:

  • 潜在的缺点是你不能参数化一个 top 命令 - 即如果你有一个过程想要按组返回前 N 个......但这可能不适用于这种情况
  • 实际上该查询也像狗一样运行。我要把它和你的一起扔掉
  • 不是。在 182 秒内完成。我在 900 之后停止了另一个 :-)
猜你喜欢
  • 1970-01-01
  • 2021-06-26
  • 2022-06-14
  • 2013-10-10
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
相关资源
最近更新 更多