Как рассчитать между различными группами строк одной группы таблиц по 1 значению - PullRequest
1 голос
/ 13 апреля 2020

У меня есть таблица как:

Days      Date       numberfield
1    2020-04-09        5500055
2    2020-04-30        5500055
3    2020-04-11        5500055
55   2020-04-12        5500055
56   2020-04-13        5500055

И мне нужно экспортировать числовые поля, которые имеют разницу больше 2 дней в определенные даты. Дайте мне все числовые поля, которые имеют разницу в днях больше двух на 11 и 12 апреля. 2020.

Я попробовал несколько подсказок отсюда, не работает для меня. Спасибо за входные данные…

Есть запрос, который я пробовал, и он работает, но не оптимизирован.

select a.date, b.date, a.numberfield, b.numberfield, b.days-a.days as difference from
(select numberfield, days, date from #tmp where date = '2020-04-11' ) a,
(select numberfield, days, date from #tmp where date = '2020-04-12' ) b
where a.numberfield = b.numberfield
order by 3

и результат:

date         date    numberfield    numberfield difference
2020-04-11   2020-04-12  5500055        5500055      1
2020-04-11   2020-04-12  5500065        5500065      1
2020-04-11   2020-04-12  5500075        5500075      1
2020-04-11   2020-04-12  5500085        5500085      1
2020-04-11   2020-04-12  5500095        5500095      562

Позвольте мне объяснить, по крайней мере, попытайтесь объяснить :) Я хочу получить числовые поля, которые имеют необычную разницу больше 1,> = 2 между двумя днями подряд.

Как этот пример 5500095. Так что возьми мне только числовые поля, которые имеют разницу> 1

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Просто join с where:

select a.date, b.date, a.numberfield, b.numberfield,
       (b.days - a.days) as difference
from #tmp a join
     #tmp b
     on a.numberfield = b.numberfield
where a.date = '2020-04-11' and b.date = '2020-04-12' and
      abs(b.days - a.days) > 1
order by 3;

Подзапросы не нужны. , , и при этом они не особенно полезны.

0 голосов
/ 13 апреля 2020

Вы можете использовать агрегацию:

select numberfield
from mytable
where date in ('2020-04-11', '2020-04-12')
group by numberfield
having
    max(case when date = '2020-04-12' then days end)
        > min(case when date = '2020-04-11' then days end) + 2

Если days всегда увеличивается, а (numberfield, date) являются уникальными, предложение having можно упростить как:

having max(numberfield) > min(numberfield) + 2
...