SQL Group By Issue

时间:2011-06-22 18:18:02

标签: sql

SELECT SomeId, ModifiedUser, MAX(ModifiedDate) 
FROM SomeTable 
GROUP BY SomeId, ModifiedUser

然后我得到这样的结果:

1000    User1    Mar 30 2011
1000    User2    Jun 25 2011
1001    User3    Mar 21 2011
1001    User4    Jun 20 2011

如何修改查询,以便我只获得

1000    User2    Jun 25 2011
1001    User4    Jun 20 2011

基本上取第一个查询结果然后按SomeId分组,最新的ModifiedDate和ModifiedUser连接到最新的ModifiedDate

3 个答案:

答案 0 :(得分:3)

你必须做2个查询并加入它们。

第一次查询:

SELECT SomeId, Max(ModifiedDate) 
FROM SomeTable GROUP BY SomeId

这挑出了“独特的信息”。然后,你加入:

SELECT SomeId, ModifiedUser, ModifiedDate 
from SomeTable 

为您提供所有数据。因此,完整的查询是:

SELECT SomeId, ModifiedUser, ModifiedDate 
FROM SomeTable 
INNER JOIN (
            SELECT SomeId, Max(ModifiedDate) maxmod 
            FROM SomeTable 
            GROUP BY SomeId) uniqueinfo ON SomeTable.SomeId = uniqueinfo.SomeId 
                                       AND ModifiedDate = uniqueinfo.maxmod

答案 1 :(得分:1)

有几种方法可以做到这一点。这是一个:

SELECT
    T1.some_id,
    T1.modified_user,
    T1.modified_date
FROM
    Some_Table T1
INNER JOIN (
        SELECT some_id, MAX(modified_date) AS max_modified_date
        FROM Some_Table
        GROUP BY some_id) SQ ON
    SQ.some_id = T1.some_id AND
    SQ.max_modified_date = T1.modified_date

这是另一个:

SELECT
    T1.some_id,
    T1.modified_user,
    T1.modified_date
FROM
    Some_Table T1
WHERE
    T1.modified_date = (
                  SELECT MAX(T2.modified_date)
                  FROM Some_Table T2
                  WHERE T2.some_id = T1.some_id)

另一个......

SELECT
    T1.some_id,
    T1.modified_user,
    T1.modified_date
FROM
    Some_Table T1
LEFT OUTER JOIN Some_Table T2 ON
    T2.some_id = T1.some_id AND
    T2.modified_date > T1.modified_date
WHERE
    T2.some_id IS NULL

第二种方法中的相关子查询通常会出现性能问题,但您可以尝试这三种方法,看看哪种方法最适合您。另外,请考虑在您的约会中“关系”的可能性。如果可以发生平局,那么您可以添加另一列或多列,以保证第一种和第三种方法的唯一性(例如PK中的列)。

答案 2 :(得分:0)

为此发明了窗口函数:

SELECT SomeID, ModifiedUser, ModifiedDate FROM
( SELECT SomeID, ModifiedUser, ModifiedDate,
  row_number() over (PARTITION BY SomeID ORDER BY ModifiedDate DESC) AS rn
) AS subqry
WHERE rn=1;

如果您想要一个平局的所有行,请将row_number替换为rank

您没有提到RDBMS的选择。 MySQL还没有这种能力。其他许多人都这样做。