Как я могу получить все данные и пометить те, которые являются самыми новыми, как новые данные? - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть таблица с названием Стандарты, которая включает ID, Стандарты, Семейство, Стандарты, Дата и Ссылка.Я хочу показать все данные, но я хочу, чтобы новейшая дата в той же семействе Стандартов и Стандартов была помечена как самая новая.Например, если у меня есть

StandardFamily,  Standards, Date
A                   a        2018
A                   a        2017
B                   b        2016
C                   c        2010
C                   c        2011
C                   c        2011
C                   c2       2018

, я хочу получить это:

StandardFamily,  Standards, Date,  Status
A                   a        2018   New
A                   a        2017   Old
B                   b        2016   New
C                   c        2010   Old
C                   c        2011   Old
C                   c        2012   New
C                   c2       2018   New

Я знаю, как получить только самую новую версию со следующим запросом:

select * 
from Standards
where (StandardFamily,Standards,Date) 
IN (select StandardFamily,Standards,Max(Date) from Standards group by StandardFamily,Standards)

Я думаю, я мог бы следовать что-то вроде

select
case when (...) then "New" else "Old" end
from Table

Любая помощь будет оценена!:)

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

В MySQL 8+ вы бы просто использовали row_number():

select s.*,
       (case when row_number() over (partition by StandardFamily, Standards order by date desc) = 1
             then 'New' else 'Old'
        end) as status
from standards s;

В более ранних версиях, я думаю, я бы использовал коррелированный подзапрос:

select s.*,
       (case when date = (select max(s2.date)
                          from standards s2
                          where s2.StandardFamily = s.StandardFamily and
                                s2.Standards = s.Standards
                          )
              then 'New' else 'Old'
        end) as status
from standards s;

В частности,это может хорошо использовать индекс на (StandardFamily, Standards, Date).

0 голосов
/ 13 февраля 2019

Вы можете получить эти результаты, введя LEFT JOIN в список MAX(Date), сгруппированный по StandardFamily и Standard, а затем проверив значения NULL в другой таблице (только записи с самыми новыми Date будет иметь ненулевые значения):

SELECT *,
    CASE WHEN s1.StandardFamily IS NULL THEN "Old" ELSE "New" END AS Status
FROM Standards s
LEFT JOIN (SELECT StandardFamily, Standards, MAX(Date) AS Date
           FROM Standards
           GROUP BY StandardFamily, Standards) s1 ON s1.StandardFamily = s.StandardFamily AND s1.Standards = s.Standards AND s1.Date = s.Date

Вывод:

StandardFamily  Standards   Date    Status
A               a           2018    New
A               a           2017    Old
B               b           2016    New
C               c           2010    Old
C               c           2011    Old
C               c           2012    New
C               c2          2018    New

Демонстрация на dbfiddle

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