Получить последние записи по двум столбцам в запросе - PullRequest
0 голосов
/ 02 октября 2018

У меня есть таблица с именем 'reports', как показано ниже:

id     company    year    quarter
1      A          2008    1
2      A          2008    2
3      A          2008    3
4      A          2008    4
5      A          2009    1
6      A          2009    2
7      B          2008    1
8      B          2008    2
9      B          2008    3
10     B          2008    4
11     B          2009    1
12     B          2009    2

Таблица содержит год и квартал.Каждый год имеет четыре четверти.Последняя запись определяется столбцом года и квартала.Таким образом, запись с самым высоким годом и самым высоким кварталом в этом году является последней записью.Я хотел бы получить последний отчет для каждой компании в одном запросе.В этом примере это будет результат.

id     company    year    quarter
6      A          2009    2
12     B          2009    2

Я пытался добиться этого с помощью следующего запроса:

select * from reports
inner join ( select company, max( year ) AS year, max( quarter ) AS quarter 
             from reports group by company ) as r 
    on r.company = reports.company 
        and r.year = reports.year 
        and r.quarter = reports.quarter

Ответы [ 3 ]

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

Пре-MySQL 8 использует подзапрос для определения последних записей для каждой компании:

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT company, MAX(year + quarter / 4.0) AS max_year
    FROM yourTable
    GROUP BY company
) t2
    ON t1.company = t2.company AND
       (t1.year + t1.quarter / 4.0) = t2.max_year;

enter image description here

Демо

Ваша текущая попытка связана с проблемой, поскольку она найдет максимальное значение для quarter без учета конкретного года.То есть, для обеих компаний будет максимальный квартал 4, хотя в их последние соответствующие годы (2009) максимальные кварталы были на самом деле 2. Я обхожу это путем формирования десятичного года, который может бытьНапример, 2009.5 для второго квартала 2009.

Начиная с MySQL 8+, мы можем воспользоваться аналитической функцией ROW_NUMBER:

SELECT id, company, year, quarter
FROM
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY company
        ORDER BY year DESC, quarter DESC) rn
    FROM yourTable
) t
WHERE t.rn = 1;

Демо

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

Я бы просто сделал:

select t.*
from t
where (t.year, t.quarter) = (select t2.year, t2.quarter
                             from t t2
                             where t2.company = t.company
                             order by t2.year desc, t2.quarter desc
                             limit 1
                            );

Здесь - реекстер.

Я не могу придумать более простого способа сделать это.И с индексом на (company, year, quarter) это должно иметь лучшую производительность, чем альтернативы.

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

использовать связанный подзапрос

    select year, company,max(id),max(quarter) from reports t
   where t.year in ( 
      select max(year)
     from reports t1 
    where t1.company=t.company 
        group by t1.company
                   )
                   group by year,company
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...