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

时间:2018-02-28 08:50:53

标签: sql sql-server window-functions

我有一个带有userId和timestamp的表。对于每个用户,我希望每天获得第一个和最后一个时间戳。我使用的是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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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声明可能会提升您的代码,在“答案”评论部分添加您宝贵的反馈意见。

相关问题