Лучший способ сравнить даты в нескольких строках - PullRequest
0 голосов
/ 10 мая 2018

Допустим, следующая таблица ...

CREATE TABLE Dummy_Data 
(
    ID INT, 
    TextField VARCHAR(20), 
    DateField DATE
)

INSERT INTO Dummy_Data (ID, TextField, DateField)
VALUES (1, 'Random Text', '2018-01-04'),
       (1, 'Random Text', '2018-02-04'),
       (1, 'Random Text', '2018-05-01'),
       (2, 'Random Text', '2017-01-14'),
       (2, 'Random Text', '2017-05-01'),
       (2, 'Random Text', '2018-01-01'),
       (2, 'Random Text', '2018-02-01'),
       (3, 'Random Text', '2018-01-04')

Я хотел бы вернуть MAX(DateField) для каждого ID, если DATEDIFF составляет менее 90 дней между каждой строкой.

Если DATEDIFF превышает 90 дней между каждой строкой, я хотел бы вернуть MAX(DateField) для каждой группировки, скажем.

Пример:

Итак, взяв строки 1–3 из приведенного выше, мы знаем, что DATEDIFF в днях между каждой строкой меньше 90, поэтому я хотел бы только вернуть:

ID   TextField      DateField
-------------------------------
1 -  Random Text    2018-05-01

Однако: строки 4-7 имеют место, когда DATEDIFF превышает 90 дней, поэтому я хотел бы вернуть:

ID   TextField     DateField
-------------------------------
2    Random Text   2017-01-14
2    Random Text   2017-05-01
2    Random Text   2018-02-01

Спасибо всем, кто может решить эту проблему.

1 Ответ

0 голосов
/ 11 мая 2018

RexTester DEMO (с использованием Express 2014), надеюсь, работает в 2012 году.

Поддерживаются Lead (), CTE и DateDiff, поэтому я не могу понять, почему это не будет ...

WITH CTE AS (
  SELECT ID
       , textField
       , DateField
       , case when datediff(dd,datefield, lead(datefield) over (partition by ID order by DateField ASC)) > 90 
                OR lead(datefield) over (partition by ID order by DateField ASC) is null then 1 
         else 0 end bInclude
  FROM  Dummy_Data)

SELECT ID, textFIeld, DateField, binclude
FROM CTE
WHERE bInclude = 1;

мы используем LEAD (), чтобы посмотреть в следующем поле даты для идентификатора. Если ноль или если> 90 дней, мы помечаем эту запись с 1; в противном случае это 0, тогда мы включаем только 1.

Дает нам:

+----+----+-------------+---------------------+----------+
|    | ID |  textFIeld  |      DateField      | binclude |
+----+----+-------------+---------------------+----------+
|  1 |  1 | Random Text | 01.05.2018 00:00:00 |        1 |
|  2 |  2 | Random Text | 14.01.2017 00:00:00 |        1 |
|  3 |  2 | Random Text | 01.05.2017 00:00:00 |        1 |
|  4 |  2 | Random Text | 01.02.2018 00:00:00 |        1 |
|  5 |  3 | Random Text | 04.01.2018 00:00:00 |        1 |
+----+----+-------------+---------------------+----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...