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

У меня есть таблица, где у меня есть такие поля, как:

ID, COL1, COL2, BOOK, PAGE

И я хочу только один результат для каждого отдельного ID. На этом я хочу основывать максимальные значения BOOK и PAGE, выбранные в этом порядке. Поэтому я бы выбрал строки, которые имеют наибольшее значение BOOK, и в этих строках выберите ту, которая имеет наибольшее значение PAGE для каждого ID. Я пишу SQL в MS ACCESS для этого.

Пример того, чего я пытаюсь достичь:

ID  COL1   COL2  BOOK  PAGE
 1    X      Y     10    12
 1    X      Z     10    14
 2    Y      W     14     7
 3    J      K     15     9
 3    J      K     16     6

Скажем, у меня было что-то вроде показанного выше. Я бы в итоге:

 ID  COL1   COL2  BOOK  PAGE
 1    X      Z     10    14
 2    Y      W     14     7
 3    J      K     16     6

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Это работает как , описанное в соответствии с моей SQL Fiddle (для MySQL)

SELECT Table1.ID, Col1, Col2, Book, Max(Page) AS MaxPage FROM Table1
INNER JOIN 
   ( SELECT ID, MAX(`Book`) AS MaxBook
     FROM Table1
     GROUP BY ID) AS t1
ON Table1.ID = t1.ID
AND Table1.Book = t1.MaxBook
Group BY Table1.ID, Book

Редактировать: добавлен код для работы с SQL Server и MS-Access

(очевидно, они не позволяют включать поля, если только в предложении GROUP BY

Тот же результат - другая скрипта SQL здесь

SELECT Table1.ID, Col1, Col2, Table1.Book, Table1.Page FROM Table1
INNER JOIN
    (SELECT Table1.ID, Book, Max(Page) AS MaxPage FROM Table1
      INNER JOIN 
        (SELECT ID, MAX(Book) AS MaxBook
         FROM Table1
         GROUP BY ID) AS t1
       ON Table1.ID = t1.ID AND Table1.Book = t1.MaxBook
       GROUP BY Table1.ID, Table1.Book) AS t2
ON Table1.ID = t2.ID 
AND Table1.Book = t2.Book 
AND Table1.Page = t2.MaxPage

Пример вывода SQL

screenshot

0 голосов
/ 03 июля 2018

Вы можете использовать not exists и коррелированный подзапрос:

select t.*
from t
where not exists (select 1
                  from t as t2
                  where t2.id = t.id and
                        t2.book > t.book or
                        (t2.book = t.book and t2.page > t.page)
                 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...