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基本上,获取第一个查询结果,然后使用最新的ModifiedDate和连接到最新的ModifiedDate的ModifiedUser按SomeId进行分组
发布于 2011-06-23 02:23:38
您必须执行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发布于 2011-06-23 02:24:46
有几种方法可以做到这一点。这里有一个:
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中的列)。
发布于 2011-06-23 06:25:07
窗口函数就是为此而发明的:
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尚不具备此功能。很多人都是这样做的。
https://stackoverflow.com/questions/6444562
复制相似问题