Mysql group by select самая последняя запись

0

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

| ID | Organisation ID | Report Year 
--------------------------------------
|  1 |   1             | 2016        
|  2 |   1             | 2017        
|  3 |   12            | 2016        
|  4 |   12            | 2017        
|  5 |   13            | 2016        
|  6 |   13            | 2017        
|  7 |   14            | 2016        

и таблицу report_files следующим образом

| ID | Report Type ID | Report ID   | Report File
---------------------------------------------------
|  1 | 1              | 1          | org1_test_report_2016.pdf
|  3 | 1              | 3          | org1_test_report_2016.pdf
|  5 | 1              | 5          | org1_test_report_2016.pdf
|  6 | 1              | 6          | org1_test_report_2017.pdf
|  7 | 1              | 7          | org1_test_report_2016.pdf

Я бы хотел получить самую последнюю запись из таблицы отчетов, т.е. Если существуют строки 2016 и 2017, я бы хотел получить 2017, и если бы существовал только 2016, то получите это и оставите присоединение к таблице report_file, чтобы получить столбец report_file с файлом имя, если оно существует для этого id, если не возвращает null. Что-то вроде этого.

| Report ID | Organisation ID | Report File
----------------------------------------------
| 2         | 1               | NULL
| 4         | 12              | NULL
| 6         | 13              | org1_test_report_2017.pdf
| 7         | 14              | org1_test_report_2016.pdf

Возможно, не правильно объяснили, пожалуйста, дайте мне знать, если вопрос не ясен. В принципе, хотите группировать groupisation_id в таблице отчетов, но получить самую последнюю строку, если существует 2017, тогда получите это, если не получите 2016, а затем оставите присоединение к таблице report_files, чтобы увидеть, прикреплен ли файл к самому последнему идентификатору отчета, если это так return file else возвращает null. Надеюсь, это имеет смысл.

Заранее спасибо.

  • 1
    Маленькая скрипка SQL очень помогла бы нам попробовать это.
  • 0
    «Я хотел бы получить самую последнюю запись из таблицы отчетов, то есть, если существуют строки 2016 и 2017 годов, я хотел бы получить 2017, и если бы только 2016» -> это звучит для меня как проблема величайшей группы в сочетании с ЛЕВОЕ СОЕДИНЕНИЕ.
Показать ещё 1 комментарий
Теги:
greatest-n-per-group

2 ответа

1
Лучший ответ

Попробуй это:

SELECT C.Report_ID, A.Organisation_ID, C.Report_File 
FROM
(SELECT Organisation_ID, MAX(Report_Year) Latest_Report_Year
FROM reports GROUP BY Organisation_ID) A 
JOIN reports B ON A.Organisation_ID=B.Organisation_ID AND A.Latest_Report_Year=B.Report_Year
JOIN report_files C ON B.ID=C.Report_ID;

Посмотрите, как это работает на SQL Fiddle.

  • 1
    Спасибо большое @cdaiga очень ценю усилия. Кажется, это работает, но мне придется проверить это с большим набором данных. Я сделаю это и вернусь к вам. Ура все кстати ...
  • 0
    Добро пожаловать @bharath
1

На основе результата, который вы хотите, я бы хотел сделать LEFT JOIN на промежуточной таблице, как MAX(Report_Year) ниже, после выбора MAX(Report_Year):

SELECT C.Report_ID, A.Organisation_ID, C.Report_File 
FROM
(SELECT Organisation_ID, MAX(Report_Year) Latest_Report_Year
FROM reports GROUP BY Organisation_ID) A 
JOIN reports B ON A.Organisation_ID=B.Organisation_ID AND
A.Latest_Report_Year=B.Report_Year
LEFT JOIN report_files C ON B.ID=C.Report_ID;

Результат:

| Report ID | Organisation ID | Report File
----------------------------------------------
| 2         | 1               | NULL
| 4         | 12              | NULL
| 6         | 13              | org1_test_report_2017.pdf
| 7         | 14              | org1_test_report_2016.pdf

SQL Fiddle здесь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню