【问题标题】:group rows based on ID and then return the row with the lowest date per ID grouping [duplicate]根据 ID 对行进行分组,然后返回每个 ID 分组中日期最短的行 [重复]
【发布时间】:2013-10-12 03:03:21
【问题描述】:

假设您有一个包含 3 列的数据集:ID、用户、日期。

即使某些行具有相同的 ID,是否可以根据最短日期过滤数据?

对不起,如果问题有点不清楚。希望下面的图片能帮助您理清思路。

有两条 ID=1 的记录,具有不同的用户和日期。我要检索的是 ID=1, USER=A, DATE=2013-01-20 的记录,因为它的日期早于第二条记录的日期(ID=1, USER=A, DATE=2013-01 -21)

我想对 ID=2 的三个记录实现相同的效果。所需的记录是 ID=2,USER=C,DATE=2013-10-20

基本上我想按它们的 ID 对这些记录进行分组,然后从该分组中获取日期最短的记录

【问题讨论】:

    标签: sql


    【解决方案1】:
    SELECT id, user, date
    FROM OriginalData od
    WHERE date = (SELECT MIN(date) 
                  FROM OriginalDate od1 
                  WHERE od.id = od1.id)
    

    【讨论】:

    • 完全按照 OP 的要求工作 :)
    • 谢谢!正是我需要的!
    【解决方案2】:
    Select * from table_name where date in 
    ( select MIN(date) from table_name)
    

    【讨论】:

    • 您的子查询返回一个值。
    • 这不是他要求的。
    • 同意@PM77-1 上面的查询只返回单行
    【解决方案3】:

    您可以在Id 属性上使用Group By 子句。

    使用以下语法

    select * from tab1 where (id, date) in (select id, min(date) from tab1 group by(id))
    

    【讨论】:

    • 仅适用于 MySql。
    • 你在其他平台测试过吗?
    • 我不必这样做。你会得到一个错误,你有字段(即用户和日期既不在GROUP BY 也不聚合。只有MySql 实现GROUP BY 扩展。试试SQL Server 或Oracle 等。见stackoverflow.com/questions/12863928/…
    猜你喜欢
    • 2021-05-06
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 2012-02-29
    • 2019-06-06
    • 2019-11-20
    • 1970-01-01
    相关资源
    最近更新 更多