Я имею ниже упомянутой таблицы в MySql.

ID       UniqueId     Date
T-1      AT-1         2018-04-03 15:16:48
T-2      AT-1         2018-04-10 18:21:24
T-3      AT-1         2018-04-22 13:05:16
T-4      AT-2         2018-05-05 17:12:04
T-5      AT-2         2018-05-15 05:03:01
T-6      AT-2         2018-05-25 06:09:23
T-7      AT-3         2018-06-01 06:09:23
T-8      AT-3         2018-06-25 06:09:23
T-9      AT-3         2018-07-01 06:09:23

Я хочу получить только те записи, в которых последние ID на основе UniqueId старше или равны 10 дням.

Например, ID T3 является самым последним ID для UniqueId AT-2 на основе даты, а разница между немедленным ID T2 составляет 12 дней.

Кроме того, если это возможно с R, это также будет работать :)

Ожидаемый результат:

ID       UniqueId     Date                  Difference
T-3      AT-1         2018-04-22 13:05:16   12
T-6      AT-2         2018-05-25 06:09:23   10
4
Vector JX 11 Апр 2019 в 11:28

2 ответа

Лучший ответ

Вы можете использовать EXISTS для проверки условий:

SELECT *
FROM t
WHERE NOT EXISTS (
    -- no newer row exists
    SELECT 1
    FROM t AS n
    WHERE n.UniqueId = t.UniqueId
    AND n.Date > t.Date
) AND NOT EXISTS (
    -- no older row exists that has difference of less than 10 days
    SELECT 1
    FROM t AS o
    WHERE o.UniqueId = t.UniqueId
    AND o.Date < t.Date
    AND o.Date >= t.Date - INTERVAL 10 DAY
)
1
Salman A 11 Апр 2019 в 09:05

Этот запрос даст вам результаты, которые вы хотите. JOIN сначала помещает таблицу в производную таблицу MAX(Date) для каждого UniqueId, а затем в себя, используя условие, что значение Date является самым последним {{X4} }} меньше максимального значения. Наконец, предложение WHERE отфильтровывает те даты, которые не менее 10 дней спустя:

SELECT t1.*, DATEDIFF(t1.date, t3.date) AS Difference
FROM test t1
JOIN (SELECT UniqueId, MAX(Date) AS Date
      FROM test
      GROUP BY UniqueID) t2 ON t2.UniqueId = t1.UniqueId AND t2.Date = t1.Date
LEFT JOIN test t3 ON t3.UniqueId = t1.UniqueId
                  AND t3.Date = (SELECT MAX(Date) 
                                 FROM test t4 
                                 WHERE t4.UniqueId = t3.UniqueId
                                   AND t4.Date < t2.Date)
WHERE DATEDIFF(t1.date, t3.date) >= 10

Выход:

ID      UniqueId    Date                    Difference
T-3     AT-1        2018-04-22 13:05:16     12
T-6     AT-2        2018-05-25 06:09:23     10

Демо на dbfiddle

1
Nick 11 Апр 2019 в 08:52