【问题标题】:How do you find the first event & time of that event for each user?您如何找到每个用户的第一个事件和该事件的时间?
【发布时间】:2021-08-22 16:23:27
【问题描述】:
user timestamp event
1 2021-2-10 answered
1 2021-2-15 answered
2 2021-2-11 answered
2 2021-2-14 answered
2 2021-2-12 unanswered
3 2021-2-16 next question
3 2021-2-13 next question
4 2021-2-12 next question
4 2021-2-17 answered

【问题讨论】:

  • 请用您正在使用的 dbms 标记您的问题。

标签: sql timestamp


【解决方案1】:

你可以考虑

查询 1. 使用 ROW_NUMBER 等窗口函数对行进行排序和过滤
查询 2. 使用查找最早开始日期的聚合查询过滤您的记录

请参阅下面的工作小提琴,其中一种方法可以完成上述建议的方法。

查询 #1

SELECT
    user,
    timestamp,
    event
FROM (
    SELECT
        *,
        ROW_NUMBER() OVER (PARTITION BY user ORDER BY timestamp) rn
    FROM
        my_table
) t
WHERE
    rn=1;
user timestamp event
1 2021-02-10 answered
2 2021-02-11 answered
3 2021-02-13 next question
4 2021-02-12 next question

查询 #2

SELECT
    t1.user,
    t1.timestamp,
    t1.event
FROM 
    my_table t1
INNER JOIN
    (
        SELECT
            user,
            MIN(timestamp) as min_timestamp
        FROM
            my_table
        GROUP BY
            user
    ) t2 ON t1.user=t2.user AND
            t1.timestamp=t2.min_timestamp;
user timestamp event
1 2021-02-10 answered
2 2021-02-11 answered
3 2021-02-13 next question
4 2021-02-12 next question

View on DB Fiddle

让我知道这是否适合你。

【讨论】:

    【解决方案2】:
    • 首先,您将根据时间戳和 id 为每一行创建排名
    • 然后我们只选择rank = 1
    WITH data as (
    
    SELECT 
    *,
    ROW_NUMBER () OVER(PARTITION BY USER ORDER BY TIMESTAMP) as rank_
    FROM my_table
    )
    
    SELECT * from data where rank_ = 1
    

    【讨论】:

      【解决方案3】:

      这应该适用于 MySQL 5.6:

      select * from (
        select * from events
        order by user, timestamp
      ) a
      group by user
      having timestamp = min(timestamp);
      

      编辑
      MySQL 8.0 版本:

      select e1.user, e1.timestamp, event from (
        select user, min(timestamp) timestamp
        from events
        group by user
      ) e1
        left join (select * from events) e2
        on e2.user = e1.user
        and e2.timestamp = e1.timestamp
      

      DB Fiddle

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多