Select 多条记录按主键分组,列上有最大值

Select multiple records grouped by primary key with max value on a column

我有一个 table 具有以下结构(虚拟列名称和数据):

+--+--+--+--+------+--------+
|a |b |c |d |issue |content |
+--+--+--+--+------+--------+
|a |b |c |d |1     |        |
|a |b |c |d |2     |        |
|a |b |c |d |3     |        |
|d |e |f |g |1     |        |
|d |e |f |g |2     |        |
|e |f |g |h |1     |        |
+--+--+--+--+------+--------+

我的主键包含列 a、b、c、d 和问题。

我需要一个语句,首先按 a、b、c 和 d 列过滤/分组,然后只选择具有 MAX(issue) 的记录。对于此示例,结果集应如下所示:

+--+--+--+--+------+--------+
|a |b |c |d |issue |content |
+--+--+--+--+------+--------+
|a |b |c |d |3     |        |
|d |e |f |g |2     |        |
|e |f |g |h |1     |        |
+--+--+--+--+------+--------+

我知道如何为一条特定记录执行此操作,但我不知道如何为所有记录执行此操作:

SELECT TOP 1 * FROM Test_Max_N_Per_Group
WHERE a = 'a' AND b = 'b' AND c = 'c' AND d = 'd'
ORDER BY issue DESC

我正在使用 Microsoft SQL Server 2008 R2。

// 编辑: 谢谢你们,我在另一个 topic:

中找到了这个(非常紧凑的)解决方案
SELECT t1.* FROM Test_Max_N_Per_Group t1
LEFT JOIN Test_Max_N_Per_Group t2
ON t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c AND t1.d  = t2.d AND
    t1.issue < t2.issue
WHERE t2.issue IS NULL

试试这个:

;with cte as
(select a,b,c,d, issue, row_number() over (partition by a,b,c,d order by issue desc) maxval, content
 from yourtable)

select a,b,c,d,issue,content
from cte
where maxval = 1

row_number() 会根据 a、b、c 和 d 的独特组合定义的组为您排名。

Demo

这不就是一个简单的group by吗?

SELECT a, b, c, d, MAX(issue)
FROM tablename
GROUP BY a, b, c, d

如果还需要内容:

SELECT a, b, c, d, issue, contents
FROM tablename t1
WHERE issue = (select max(issue) from tablename t2
               where t1.a = t2.a
                 and t1.b = t2.b
                 and t1.c = t2.c
                 and t1.d = t2.d)

如果是平局,将列出两行!