MYSQL запрос для выбора только самой последней строки данных, установленной с истекшими датами - PullRequest
0 голосов
/ 26 февраля 2020

Из следующего примера набора данных я пытаюсь получить только самые последние сведения о политике (авто, дома и в режиме реального времени) для клиентов, у которых истек срок действия политик.

+-----------+-----------+-------------+-----------------+
| record_id | client_id | policy_type | expiration_date |
+-----------+-----------+-------------+-----------------+
|       001 |       001 | auto        | 2019-05-06      |
|       002 |       001 | home        | 2019-05-06      |
|       003 |       001 | life        | 2019-05-06      |
|       004 |       002 | auto        | 2019-07-22      |
|       005 |       002 | home        | 2019-07-22      |
|       006 |       002 | life        | 2019-07-22      |
|       007 |       001 | auto        | 2020-01-20      |
|       008 |       001 | home        | 2020-01-20      |
|       009 |       001 | life        | 2020-01-20      |
|       010 |       003 | auto        | 2019-07-23      |
|       011 |       003 | home        | 2019-07-23      |
|       012 |       003 | life        | 2019-07-23      |
|       013 |       004 | auto        | 2019-01-30      |
|       014 |       004 | home        | 2019-01-30      |
|       015 |       004 | life        | 2019-01-30      |
|       016 |       002 | auto        | 2020-04-11      |
|       017 |       002 | home        | 2020-04-11      |
|       018 |       002 | life        | 2020-04-11      |
|       019 |       003 | auto        | 2020-06-17      |
|       020 |       003 | home        | 2020-06-17      |
|       021 |       003 | life        | 2020-06-17      |
|       022 |       004 | auto        | 2020-02-01      |
|       023 |       004 | home        | 2020-02-01      |
|       024 |       004 | life        | 2020-02-01      |
+-----------+-----------+-------------+-----------------+

Если кто-то может помочь с запрос, я буду очень признателен.

Спасибо, Раффи

1 Ответ

1 голос
/ 27 февраля 2020

Для СУБД версии 8+ вы можете использовать аналитическую функцию c, такую ​​как dense_rank()

SELECT record_id, client_id, policy_type, expiration_date 
  FROM
 (
  SELECT t.*,
         dense_rank() over (partition by client_id, policy_type order by expiration_date desc) as dr 
    FROM tab t
) tt
WHERE dr = 1;

. Вышеуказанная группировка обрабатывается с помощью partition by, а самая последняя дата получается с помощью Предложение order by после фильтрации путем возврата значений 1 из функции analyti c

Для всех версий (особенно до 8) может использоваться следующий оператор

SELECT t1.record_id, t1.client_id, t1.policy_type, t1.expiration_date 
  FROM tab t1
  JOIN
      (
       SELECT max(expiration_date) AS expiration_date, policy_type 
         FROM tab
        GROUP BY client_id, policy_type
       ) t2
    ON t2.expiration_date=t1.expiration_date AND t2.policy_type = t1.policy_type;

Учитывая ваш комментарий о том, что результаты должны быть для каждого клиента, я добавил столбец client_id в список partition by первого запроса и список GROUP BY второго запроса.

Демо

...