首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Group By Issue

SQL Group By Issue
EN

Stack Overflow用户
提问于 2011-06-23 02:18:02
回答 3查看 151关注 0票数 3
代码语言:javascript
复制
SELECT SomeId, ModifiedUser, MAX(ModifiedDate) 
FROM SomeTable 
GROUP BY SomeId, ModifiedUser

然后我得到这样的结果:

代码语言:javascript
复制
1000    User1    Mar 30 2011
1000    User2    Jun 25 2011
1001    User3    Mar 21 2011
1001    User4    Jun 20 2011

如何修改查询,以便仅获取

代码语言:javascript
复制
1000    User2    Jun 25 2011
1001    User4    Jun 20 2011

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-23 02:23:38

您必须执行2个查询并连接它们。

第一个查询:

代码语言:javascript
复制
SELECT SomeId, Max(ModifiedDate) 
FROM SomeTable GROUP BY SomeId

这就挑出了“独特的信息”。然后,您可以使用以下命令加入:

代码语言:javascript
复制
SELECT SomeId, ModifiedUser, ModifiedDate 
from SomeTable 

给你所有的数据。因此,完整的查询是:

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2011-06-23 02:24:46

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

代码语言:javascript
复制
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

这是另一个:

代码语言:javascript
复制
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)

还有另一个..。

代码语言:javascript
复制
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中的列)。

票数 1
EN

Stack Overflow用户

发布于 2011-06-23 06:25:07

窗口函数就是为此而发明的:

代码语言:javascript
复制
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尚不具备此功能。很多人都是这样做的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6444562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档