我有一张带测量值的表。每分钟进行一次测量。我只需要为相同的 device_id 连续多次选择具有相同 sample_value 的行。
以下是初始数据:
sample_date sample_time device_id sample_value
20180701 1010 111 11
20180701 1011 111 12
20180701 1012 111 13
20180701 1013 222 11
20180701 1014 222 11
20180701 1015 222 12
20180701 1016 111 12
20180701 1017 111 11
20180701 1018 222 13
20180701 1019 222 12
20180701 1020 222 13
20180701 1021 222 12
20180701 1022 222 12
20180701 1023 111 12
20180701 1024 111 13
20180701 1025 111 13
20180701 1026 111 12
20180701 1027 111 13
20180701 1028 222 14
20180701 1029 222 13
20180701 1030 222 14
20180701 1031 222 14
20180701 1032 222 14
20180701 1033 222 14
20180701 1034 222 14
20180701 1035 222 14
20180701 1036 111 13
20180701 1037 111 13
20180701 1038 111 14
20180701 1039 111 13
这是我正在寻找的结果:
sample_date sample_time device_id sample_value
20180701 1013 222 11
20180701 1014 222 11
20180701 1021 222 12
20180701 1022 222 12
20180701 1024 111 13
20180701 1025 111 13
20180701 1030 222 14
20180701 1031 222 14
20180701 1032 222 14
20180701 1033 222 14
20180701 1034 222 14
20180701 1035 222 14
20180701 1036 111 13
20180701 1037 111 13
下面是测试数据:
IF OBJECT_ID('samples', 'U') IS NOT NULL
DROP TABLE samples;
create table samples (
sample_date int,
sample_time int,
device_id int,
sample_value int
)
insert samples
values
(20180701, 1010, 111, 11)
,(20180701, 1011, 111, 12)
,(20180701, 1012, 111, 13)
,(20180701, 1013, 222, 11)
,(20180701, 1014, 222, 11)
,(20180701, 1015, 222, 12)
,(20180701, 1016, 111, 12)
,(20180701, 1017, 111, 11)
,(20180701, 1018, 222, 13)
,(20180701, 1019, 222, 12)
,(20180701, 1020, 222, 13)
,(20180701, 1021, 222, 12)
,(20180701, 1022, 222, 12)
,(20180701, 1023, 111, 12)
,(20180701, 1024, 111, 13)
,(20180701, 1025, 111, 13)
,(20180701, 1026, 111, 12)
,(20180701, 1027, 111, 13)
,(20180701, 1028, 222, 14)
,(20180701, 1029, 222, 13)
,(20180701, 1030, 222, 14)
,(20180701, 1031, 222, 14)
,(20180701, 1032, 222, 14)
,(20180701, 1033, 222, 14)
,(20180701, 1034, 222, 14)
,(20180701, 1035, 222, 14)
,(20180701, 1036, 111, 13)
,(20180701, 1037, 111, 13)
,(20180701, 1038, 111, 14)
,(20180701, 1039, 111, 13)
select * from samples
这是我尝试使用的 SQL,但我不知道如何设置正确的分区。
select *
from (select sample_date,
sample_time,
device_id,
sample_value,
row_number() over (partition by sample_date,
device_id,
sample_value
order by sample_date,
sample_time,
device_id) as occurrence
from samples) t
where occurrence > 1
类似话题:
Select statement to find duplicates on certain fields
How to find consecutive rows based on the value of a column?
最佳答案
如果您想在不使用 LEAD
的情况下执行此操作或 LAG
那么你可以做这样的事情:
WITH Ordered AS (
SELECT
*,
ROW_NUMBER() OVER (ORDER BY sample_date, sample_time) AS order_id
FROM
samples)
SELECT
s1.sample_date,
s1.sample_time,
s1.device_id,
s1.sample_value
FROM
Ordered s1
INNER JOIN Ordered s2 ON s2.device_id = s1.device_id AND s2.sample_value = s1.sample_value AND s2.order_id = s1.order_id + 1
UNION
SELECT
s2.sample_date,
s2.sample_time,
s2.device_id,
s2.sample_value
FROM
Ordered s1
INNER JOIN Ordered s2 ON s2.device_id = s1.device_id AND s2.sample_value = s1.sample_value AND s2.order_id = s1.order_id + 1
ORDER BY
1, 2;
结果是:
sample_date sample_time device_id sample_value
20180701 1013 222 11
20180701 1014 222 11
20180701 1021 222 12
20180701 1022 222 12
20180701 1024 111 13
20180701 1025 111 13
20180701 1030 222 14
20180701 1031 222 14
20180701 1032 222 14
20180701 1033 222 14
20180701 1034 222 14
20180701 1035 222 14
20180701 1036 111 13
20180701 1037 111 13
关于SQL选择具有相同值的连续记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51964625/