SQL选择具有相同值的连续记录

标签 sql sql-server-2014 gaps-and-islands

我有一张带测量值的表。每分钟进行一次测量。我只需要为相同的 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/

相关文章:

postgresql - 自动递增,但忽略列中的现有值

sql - 组顺序整数postgres

sql - 在具有约束的类中选择不同的成员

python - isnull(col1,col2) 在 Pandas 中等效

sql-server - 识别需要分区的对象

sql - 尝试对 sql 使用通配符替换函数

postgresql - 从存储的事件开始和结束时间中获取空闲时间

sql - 将变量传递到 SQL 字符串

sql - Postgresql 表相交

sql-server - 使用 sql 基于动态列值(属性)对记录进行组合(变体)