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
答案 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还没有这种能力。其他许多人都这样做。