Как выбрать строки, в которых значение изменилось, элемент является новым для даты или уходит от предыдущей даты - PullRequest
0 голосов
/ 14 июня 2019

Хорошо, я смог реализовать части этого вопроса независимо, но я не могу их объединить.

Мой стол выглядит примерно так

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

Я могу сделать это, просто отметив любую из трех вещей, но я в конце концов пытаюсь их связать.

Спасибо за вашу помощь, ребята. Это всегда очень ценится.

Ответы [ 2 ]

2 голосов
/ 14 июня 2019

Вы, кажется, хотите 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;
1 голос
/ 14 июня 2019

Код ниже будет работать для фиксированной даты:

select 
a.thing, a.ID1, a.ID2, a.value, b.value as YDAY_VALUE, a.date
from test a, test b
where a.thing = b.thing and 
a.ID1 = b.ID1 and 
a.ID2 = b.ID2 and 
a.date = b.date+1
union select
a.thing, a.ID1, a.ID2, a.value, null as YDAY_VALUE, a.date
from test a where a.date ="20190606" and  a.thing not in (select  b.thing from test b
where a.thing = b.thing and 
a.ID1 = b.ID1 and 
a.ID2 = b.ID2 and 
b.date="20190605")
union select
a.thing, a.ID1, a.ID2, null as value, a.value as YDAY_VALUE, a.date
from test a where a.date ="20190605" and  a.thing not in (select  b.thing from test b
where a.thing = b.thing and 
a.ID1 = b.ID1 and 
a.ID2 = b.ID2 and 
b.date="20190606")
 ;

однако, если вы попытаетесь экстраполировать на какие-либо даты, это может привести к дублированию ваших пустых / несоответствующих записей - следите за этим - например, изменение условия, как показано ниже, даст вам сегодняшние записи, которые были оставлены, и вчерашние записи, которые были оставлены. Но, возможно, это выходит за рамки ваших возможностей.

union select
a.thing, a.ID1, a.ID2, a.value, null as YDAY_VALUE, a.date
from test a where a.thing not in (select  b.thing from test b
where a.thing = b.thing and 
a.ID1 = b.ID1 and 
a.ID2 = b.ID2 and 
a.date = b.date+1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...