分组依据问题 - 需要获取唯一列组合的最新行

时间:2011-07-25 09:10:06

标签: sql sql-server

我的表结构(在SQL Server中)看起来像这样:(D1比D2更新,PK是普通Identity(1,1)列)

Name  Type  Score  Date
A1    B1    C1     D1
A1    B2    C2     D1
A1    B1    C3     D2

我需要做的是找到ScoreName的每个唯一组合的最新Type值,即:

A1    B1    C1     D1
A1    B2    C2     D1

我最初只是使用昨天的日期来完成这项工作,但并不是每天都会更新,所以有时会丢失分数。 我可以通过简单的

获得我需要看到的独特组合
SELECT Name, Type FROM Table GROUP BY Name, Type ORDER BY MAX(Date)

但我显然无法添加其他两列,或者这些组不再是唯一的。

我已经看过类似的问题,但它们都有差异,这些差异使得它们对我来说没用。

非常感谢任何帮助。我有一种感觉,这是一个相当简单的问题,我只是不知道要弄清楚它!

3 个答案:

答案 0 :(得分:6)

SELECT s.Name, s.Type, s.Score
FROM (
    SELECT Name, Type, MAX(Date) AS MaxDate
    FROM Scores
    GROUP BY Name, Type
) m
INNER JOIN Scores s ON m.Name = s.Name AND m.Type = s.Type AND m.MaxDate = s.Date

答案 1 :(得分:2)

标准(ANSI)SQL解决方案:

SELECT name,
       type, 
       score,
       Date,
FROM ( 
   SELECT name,
          type, 
          score,
          Date,
          row_number() over (partition by name, type order by Date desc) as rn
   FROM your_table
) t
WHERE rn = 1

根据您的DBMS,您可能需要引用列名“类型”和“日期”,因为它们是保留字。

答案 2 :(得分:0)

据我所知,实现这一目标的最佳方法是使用自联接,如果必须与数据库无关。

SELECT name, type, date, t2.score
  FROM (SELECT   name, type, MAX (date) date
            FROM  testdata
        GROUP BY name, type) t1
       JOIN
       testdata t2 USING (name, type, date)