Как получить последний измененный ряд с условием - PullRequest
0 голосов
/ 08 октября 2018

У меня есть ниже упомянутые таблицы:

Table1:

ID        Unique_Key      Date                     MapId
II-10     RTE-011         2018-04-07 15:18:25      er-12-tt
II-11     RTE-011         2018-05-17 11:44:47      er-13-td
II-12     RTE-011         2018-06-12 13:22:29      ee-13-rt
II-13     RTE-012         2018-04-07 19:17:14      eg-15-st
II-14     RTE-012         2018-04-07 21:22:37      hr-15-yt
II-15     RTE-013         2018-07-07 20:27:38      tr-16-yt
II-15     RTE-013         2018-08-07 14:18:33      tr-16-yt

Table2: 

Id              Status
er-12-tt        Open
er-13-td        Closed
er-13-rt        Closed
eg-15-st        Closed
hr-15-yt        Pending
tr-16-yt        Open
tr-16-yt        Pending

Используя вышеупомянутые обе таблицы, я хочу получить самую последнюю строку только тех записей, которые имеют статус Closed.

Нам нужно исключить те Unique_Key, для которых любое значение не равно Closed

Требуемый вывод будет:

ID        Unique_Key      Date                     MapId          Id         Status
II-12     RTE-011         2018-06-12 13:22:29      ee-13-rt       er-13-rt        Closed
II-13     RTE-012         2018-04-07 19:17:14      eg-15-st       eg-15-st        Closed    

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Во-первых, в подзапросе мы определяем максимальную дату для группы Unique_Key.Мы отфильтровываем те Unique_Key значения, которые имеют по крайней мере одну строку с Status = Closed, используя HAVING SUM(t2.Status = Closed) > 0

. Затем набор результатов этого подзапроса используется как Производная таблица .Затем он присоединяется к Table1 и Table2, и мы отфильтровываем те случаи, когда максимальный статус равен Closed, используя WHERE t22.Status = 'Closed'

Попробуйте:

SELECT t11.ID, 
       t11.Unique_Key, 
       t11.Date, 
       t11.MapId, 
       t22.Id, 
       t22.Status 
FROM Table1 AS t11 
JOIN Table2 AS t22 ON t22.Id = t11.MapId 
JOIN (
       SELECT t1.Unique_Key, 
              MAX(t1.Date) AS max_Date 
       FROM Table1 AS t1 
       JOIN Table2 AS t2 ON t2.Id = t1.MapId 
       GROUP BY t1.Unique_Key 
       HAVING SUM(t2.Status = Closed) > 0 
     ) AS dt ON dt.Unique_Key = t11.Unique_Key AND 
                dt.max_Date = t11.Date 
WHERE t22.Status = 'Closed'
0 голосов
/ 08 октября 2018

Здесь мы можем использовать общий подход и присоединиться к подзапросу, чтобы выполнить фильтрацию:

SELECT
    t1.ID, t1.Unique_Key, t1.Date, t1.MapId, t2.Id, t2.Status
FROM Table1 t1
INNER JOIN Table2 t2
    ON t1.MapId = t2.Id
INNER JOIN
(
    SELECT t1.Unique_Key, MAX(t1.Date) AS max_date
    FROM Table1 t1
    INNER JOIN Table2 t2
        ON t1.MapId = t2.Id
    WHERE t2.Status = 'Closed'
    GROUP BY t1.Unique_Key
) t3
    ON t1.Unique_Key = t3.Unique_Key AND t1.Date = t3.max_date;

enter image description here

Demo

При присоединении к подзапросу с псевдонимом t3 отфильтровываются все записи для каждого уникального ключа, кроме самого последнего, который имеет закрытый статус.

Ради потомков, есть другой подход к этому вопросу с использованием аналитических функций.Учитывая, что MySQL 8+ скоро станет стандартом, имеет смысл рассмотреть и эту опцию:

SELECT
    ID_t1, Unique_Key, Date, MapId, ID_t2, Status
FROM
(
    SELECT t1.ID AS ID_t1, t1.Unique_Key, t1.Date, t1.MapId, t2.Id AS ID_t2,
        t2.Status,
        ROW_NUMBER() OVER (PARTITION BY t1.Unique_Key ORDER BY t1.Date DESC) rn
    FROM Table1 t1
    INNER JOIN Table2 t2
        ON t1.MapId = t2.Id
    WHERE t2.Status = 'Closed'
) t
WHERE rn = 1;

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...