每个用户每天的 SQL 第一个和最后一个时间戳

Posted

技术标签:

【中文标题】每个用户每天的 SQL 第一个和最后一个时间戳【英文标题】:SQL first and last timestamp per day per user 【发布时间】:2018-02-28 08:50:53 【问题描述】:

我有一个带有 userId 和时间戳的表。对于每个用户,我想每天获取第一个和最后一个时间戳。我正在使用 SQL Server。 它的样子:

|User|         Date        |
----------------------------
| 1  | 2015-01-08 07:31:40 |
| 1  | 2015-01-08 18:35:40 |
| 1  | 2015-01-08 22:31:40 |
| 1  | 2015-01-09 05:35:40 | 
| 1  | 2015-01-09 06:31:40 |
| 1  | 2015-01-09 07:35:40 | 
| 1  | 2015-01-09 12:38:40 | 
| 1  | 2015-01-09 23:38:40 |    
| 2  | 2015-01-08 05:55:40 |
| 2  | 2015-01-08 10:48:40 |
| 2  | 2015-01-08 15:38:40 |
| 2  | 2015-01-08 21:50:40 |
| 2  | 2015-01-09 10:38:40 |
| 2  | 2015-01-09 14:33:40 |
| 2  | 2015-01-09 15:38:40 |
| 2  | 2015-01-09 17:38:40 |
| 2  | 2015-01-09 19:55:40 |

我需要的输出:

|User|         Date        |
----------------------------
| 1  | 2015-01-08 07:31:40 |
| 1  | 2015-01-08 22:31:40 |
| 1  | 2015-01-09 05:35:40 |
| 1  | 2015-01-09 23:38:40 |
| 2  | 2015-01-08 05:55:40 |
| 2  | 2015-01-08 21:50:40 |
| 2  | 2015-01-09 10:38:40 |
| 2  | 2015-01-09 19:55:40 |

到目前为止,它只适用于一个用户名:

SELECT 
    User, 
    Date, 
    min(Date) OVER(PARTITION BY Datepart(dy,Date)) as first, 
    max(Date) OVER(PARTITION BY Datepart(dy,Date)) as last
FROM 
    Tablename
WHERE 
    User = UserId

【问题讨论】:

查看 GROUP BY! 您使用的是哪个 dbms? 显示你到目前为止所做的事情......通过minimal reproducible example 【参考方案1】:
SELECT 
    User, 
    Date, 
    min(Date) OVER(PARTITION BY Datepart(dy,Date)) as first, 
    max(Date) OVER(PARTITION BY Datepart(dy,Date)) as last
FROM 
    Tablename
GROUP BY
    Userid

Group-By 声明可能会提升您的代码,请在 Answer 的评论部分添加您的宝贵反馈。

【讨论】:

【参考方案2】:

按用户和日期列分组。日期列必须对其时间部分进行修剪,如下所示:

SELECT MAX([Date]), MIN([Date]) FROM [TableName] GROUP BY [User], CONVERT(DATE, [Date])

语法对 SQL Server 有效,但方法应该与 DBMS 无关

【讨论】:

它将给出groupby的第一个值和最后一个值,它不起作用。请再看一遍。 是的,但他想要第一个 - MIN 和最后一个 - 每天和用户的 MAX 值(用于 GROUP BY)。我认为它符合他要求的标准。 按日期划分,不满足查询。

以上是关于每个用户每天的 SQL 第一个和最后一个时间戳的主要内容,如果未能解决你的问题,请参考以下文章

一条sql 语句查询用户表,返回每天的用户量和时间,表里面的时间是时间戳的格式

在更大的数据表上为每个用户选择第一行/最后一行的 SQL 性能

基于最近时间戳连接两个表的 SQL 查询

从查询 SQL Server 中的每个日期获取第一个和最后一个日期时间

BigQuery:如何执行滚动时间戳窗口组计数,每天产生行

每个用户 ID 的 first_value 和 last_value