[英]How to filter unique records depending to some condition by SQL
我有一个 SQL 服务器数据库,其中包含一个从考勤设备获取数据的表。
它看起来像这样:
ID | 用户身份 | 日期 | 时间 | 指示方向 |
---|---|---|---|---|
1988781 | 25000 | 2022/01/11 | 10:02 | 1 |
1988782 | 25000 | 2022/01/11 | 10:03 | 1 |
1988783 | 25000 | 2022/01/11 | 10:04 | 1 |
1988784 | 25000 | 2022/01/11 | 12:30 | 2 |
1988785 | 25000 | 2022/01/11 | 12:31 | 2 |
1988786 | 25001 | 2022/01/11 | 10:00 | 1 |
1988787 | 25001 | 2022/01/11 | 12:30 | 2 |
1988788 | 25002 | 2022/01/11 | 10:15 | 1 |
1988789 | 25002 | 2022/01/11 | 10:16 | 1 |
1988790 | 25002 | 2022/01/11 | 12:19 | 2 |
如何过滤每个用户 ID 的数据以使 SignDirection = 1 的时间更短,而 SignDirection = 2 的时间更长?
像是:
ID | 用户身份 | 日期 | 时间 | 指示方向 |
---|---|---|---|---|
1988781 | 25000 | 2022/01/11 | 10:02 | 1 |
1988785 | 25000 | 2022/01/11 | 12:31 | 2 |
1988786 | 25001 | 2022/01/11 | 10:00 | 1 |
1988787 | 25001 | 2022/01/11 | 12:30 | 2 |
1988788 | 25002 | 2022/01/11 | 10:15 | 1 |
1988790 | 25002 | 2022/01/11 | 12:19 | 2 |
我努力了
select distinct
但没有成功。
您可以计算 2 row_number,向上和向下。
然后过滤它们。
SELECT ID, UserID, [Date], [Time], SignDirection
(
SELECT *
, ROW_NUMBER() OVER (PARTITION BY UserID, SignDirection, [Date] ORDER BY [Time] ASC) rn_asc
, ROW_NUMBER() OVER (PARTITION BY UserID, SignDirection, [Date] ORDER BY [Time] DESC) rn_desc
FROM your_time_and_attendance_table t
) q
WHERE ((SignDirection = 1 AND rn_asc = 1) OR
(SignDirection = 2 AND rn_desc = 1))
ORDER BY ID, UserID, [Date], [Time], SignDirection
@LukStorms 给出的答案很好,但它需要对第二个行号进行另一种排序。
您可以改为使用具有相同排序的LEAD
来检测最后一行
SELECT
ID,
UserID,
[Date],
[Time],
SignDirection
FROM
(
SELECT *
, ROW_NUMBER() OVER (PARTITION BY UserID, SignDirection, [Date] ORDER BY [Time]) rn_asc
, LEAD(Time) OVER (PARTITION BY UserID, SignDirection, [Date] ORDER BY [Time]) nextTime
FROM YourTable t
) q
WHERE ((SignDirection = 1 AND rn_asc = 1) OR
(SignDirection = 2 AND nextTime IS NULL))
ORDER BY
ID,
UserID,
[Date],
[Time],
SignDirection;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.