gpt4 book ai didi

SQL:获取连续值的所有变化点

转载 作者:行者123 更新时间:2023-11-29 13:29:19 24 4
gpt4 key购买 nike

我有一个非常频繁采样的传感器值,因此该值对于多个样本保持不变,即:

Date        Value2010-01-01  1.3452010-01-02  1.3452010-01-03  1.5552010-01-04  1.5552010-01-05  1.5552010-01-06  1.3452010-01-07  1.7522010-01-08  1.752

并且只想获得值变化的行:

Date        Value2010-01-01  1.3452010-01-03  1.5552010-01-06  1.3452010-01-07  1.752

一个选项是使用 LAG 窗口函数获取每一行的前一行(按日期排序)并比较当前/上一行,但我想知道是否有纯 SQL 解决方案。我用自外连接解决了这个问题

SELECT t1.date, t1.valueFROM table t1 LEFT OUTER JOIN table t2ON t1.value = t2.valueAND t1.date > t2.dateWHERE t2.date IS NULL;

但这只适用于没有重复值的情况,就像这里的值 1.345 一样

我必须补充一点,不幸的是日期值是唯一的,但通常不是等距的。

我目前正在使用 PostgreSQL 数据库,但我相信这个问题可以适用于任何系统。

最佳答案

通过使用排名和链接到前几天的数据,只有当最后一天不等于第二天时才显示。

DECLARE @t TABLE ([Date] DATE, Value DECIMAL(18,10))

INSERT INTO @t VALUES
('2010-01-01', 1.345),
('2010-01-02', 1.345),
('2010-01-03', 1.555),
('2010-01-04', 1.555),
('2010-01-05', 1.555),
('2010-01-06', 1.345),
('2010-01-07', 1.752),
('2010-01-08', 1.752)

SELECT
pDATA.[DATE],
pDATA.[VALUE]
FROM
(SELECT
T2.[DATE],
T2.VALUE ,
RANK() OVER (ORDER BY T2.[DATE]) - 1 AS R2
FROM @T AS T2) AS pDATA
LEFT OUTER JOIN
(SELECT
T1.[DATE],
T1.VALUE ,
RANK() OVER (ORDER BY [DATE]
) AS R FROM @T AS T1) AS DATA

ON DATA.R = pDATA.R2
WHERE
DATA.Value != pDATA.Value
OR DATA.Value IS NULL

关于SQL:获取连续值的所有变化点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27446048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com