首页 > 解决方案 > 如何选择值已更改的行、某个日期的新项目或从前一个日期离开的项目

问题描述

好的,我能够独立实现这个问题的一部分,但我似乎无法将它们结合起来。

我的桌子看起来像这样

THING  | ID1 | ID2 | VALUE |     DATE
-------------------------------------
thing1 |  a1 |  1a |     5 | 20190605
thing2 |  a2 |  2c |    10 | 20190605
thing4 |  a5 |  3x |     7 | 20190605
thing1 |  a1 |  1a |     6 | 20190606
thing2 |  a2 |  2c |    10 | 20160606
thing3 |  a3 |  2b |     3 | 20160606

但是每天有数千个元素和八九个标识符,但是一旦我们找到解决方案,我就可以推断出来。

我希望能够返回任何VALUE一天都发生变化的元素,或者是前一天不存在的新元素。我还希望能够看到前一天的值是多少,所以NULL如果它不存在应该是,如果它存在应该是前一天的值。我也想以同样的方式看到,前一天存在的元素今天不再存在。我的查询结果将是表上的某种外部连接和EXISTS某处的检查......

查询将从上表返回,如下表。

 THING | ID1 | ID2 | VALUE | YDAY_VALUE |     DATE
--------------------------------------------------
thing1 |  a1 |  1a |     6 |          5 | 20190606
thing4 |  a5 |  3x |  NULL |          7 | 20190606
thing3 |  a3 |  2b |     3 |       NULL | 20190606

我可以通过检查三件事中的任何一件来做到这一点,但我束手无策,试图把它们锁起来。

谢谢你们的帮助。它总是很受欢迎。

标签: sqlsql-server

解决方案


你似乎想要一个join

select t.*, tprev.value as prev_value
from t full join
     t tprev
     on t.thing = tprev.thing and
        t.id1 = tprev.id1 and
        t.id2 = tprev.id2 and
        t.date = dateadd(day, 1, tprev.date)
where tprev.thing is null or
      tnext.thing is null or
      tprev.value <> t.value;

推荐阅读