Как выбрать всю строку на основе нескольких столбцов максимальной даты - PullRequest
0 голосов
/ 27 июня 2019

Я хочу выбрать всю строку, которая была отфильтрована по 2 столбцам с максимальной датой -

Итак, если у меня есть стол (Поставка):

D_id |O_id  | O_date    | Start_date| amount 
400  |1     | 2018-2-7  | 2018-4-7  | 500
401  |1     | 2019-8-2  | 2019-10-1 | 1500
402  |1     | 2019-8-2  | 2019-12-7 | 200
403  |2     | 2016-4-10 | 2016-5-7  | 100
404  |2     | 2018-12-1 | 2018-12-17| 50
405  |2     | 2018-12-1 | 2019-1-1  | 2500

Выходные данные, следовательно, должны группироваться по d_id и отображать всю строку, которая имеет максимальное значение O_date и максимальное значение start_date

D_id |O_id  | O_date    |  Start_date | amount |
402  |1     | 2019-8-2  | 2019-12-7   | 200
405  |2     | 2018-12-1 | 2019-1-1    | 2500

Проблема, с которой я столкнулся, заключается в использовании max и group by condition, SQL не соответствует полям для каждой строки.

select max(O_DATE),
MAX(START_DATE),
D_ID,
AMOUNT,
O_ID
FROM SUPPLY
group by
O_ID;

Ответы [ 4 ]

0 голосов
/ 27 июня 2019

O_DATE имеет приоритет над START_DATE

select *
from SUPPLY t
join (
    select MAX(t.START_DATE) maxSd, m.maxOd, t.O_ID
    from SUPPLY t
    join (    
        select max(O_DATE) maxOd, O_ID
        from SUPPLY
        group by O_ID
    ) m on m.O_ID = t.O_ID and m.maxOd = t.O_DATE;
    group by m.maxOd, t.O_ID
) m2 on m2.O_ID = t.O_ID and m2.maxOd = t.O_DATE and m2.maxSd = t.START_DATE

Начиная с 8, его можно просто использовать с помощью функций WINDOW

0 голосов
/ 27 июня 2019

Это то, что вы ищете:

select
 t1.D_id, t1.O_id, t2.o_date, t2.Start_date, t1.amount 
from SUPPLY t1
outer apply (
     select O_id, Max(O_date) as o_date, MAX(Start_date) as Start_date from SUPPLY
        group by O_id
) as t2 where t2.O_id = t1.O_id and t2.o_date = t1.O_date and t2.Start_date = t1.Start_date
0 голосов
/ 27 июня 2019

Вы можете сделать это, присоединив свой запрос к таблице:

SELECT s.* 
FROM SUPPLY s INNER JOIN (
  SELECT 
    max(O_DATE) O_DATE,
    max(START_DATE) START_DATE
  FROM SUPPLY
  GROUP BY O_ID
) g ON g.O_ID = s.O_ID AND g.O_DATE = s.O_DATE AND g.START_DATE = s.START_DATE

или с НЕ СУЩЕСТВУЮЩИМ:

SELECT s.* 
FROM SUPPLY s 
WHERE NOT EXISTS (
  SELECT 1 FROM SUPPLY
  WHERE O_ID = s.O_ID AND O_DATE > s.O_DATE AND START_DATE > s.START_DATE 
)
0 голосов
/ 27 июня 2019

Этот следующий запрос должен работать для вас.По вашей логике, START_DATE является общим для обоих случаев, и соединение между START_DATE должно помочь.

SELECT * FROM SUPPLY A
INNER JOIN 
(
    SELECT O_ID,
    MAX(O_DATE) O_DATE,
    MAX(START_DATE) START_DATE
    FROM SUPPLY
    group by O_ID
)B 
ON A.O_ID = B.O_ID
AND A.START_DATE = B.START_DATE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...