SQL результаты заказа по местному максимуму каждой группы - PullRequest
2 голосов
/ 13 февраля 2020

Я изо всех сил пытаюсь написать запрос, который возвращает то, что я хочу. Таблица:


|---------------------|------------------|------------------|------------------|
|   --  filename  --  |    --  url  --   |   -- pixels  --  |     -- id --     |
|---------------------|------------------|------------------|------------------|
|     myfilename1     |         url1     |         3100     |         1        |
|---------------------|------------------|------------------|------------------|
|     myfilename2     |         url1     |         1200     |         2        |
|---------------------|------------------|------------------|------------------|
|     myfilename3     |         url2     |         3000     |         3        |
|---------------------|------------------|------------------|------------------|
|     myfilename4     |         url3     |         4000     |         4        |
|---------------------|------------------|------------------|------------------|
|     myfilename5     |         url3     |         5000     |         5        |
|---------------------|------------------|------------------|------------------|

Как я хочу получить результаты:

|---------------------|------------------|------------------|------------------|
|   --  filename  --  |    --  url  --   |   -- pixels  --  |     -- id --     |
|---------------------|------------------|------------------|------------------|
|     myfilename4     |         url3     |         4000     |         4        |
|---------------------|------------------|------------------|------------------|
|     myfilename5     |         url3     |         5000     |         5        |
|---------------------|------------------|------------------|------------------|
|     myfilename1     |         url1     |         3100     |         1        |
|---------------------|------------------|------------------|------------------|
|     myfilename2     |         url1     |         1200     |         2        |
|---------------------|------------------|------------------|------------------|
|     myfilename3     |         url2     |         3000     |         3        |
|---------------------|------------------|------------------|------------------|

В основном я бы хотел, чтобы результаты были упорядочены так, чтобы URL-группы "упорядочивались" пиксель между собой, а затем каждая группа внутренне упорядочена по id. Как вы можете видеть в таблице результатов, которые я хотел бы, максимум столбца пикселей составляет 5000, поэтому группа «url3» является первой, и она упорядочена по id. Затем следует группа url1, для которой локальный максимум является вторым по величине (3100).

Обратите внимание, что количество строк может составлять десятки тысяч, и не будет отображаться больше строк, а может быть и больше. добавлено в будущем, поэтому жестко закодированные ответы бесполезны. Это должно быть разбито на страницы по URL, поэтому запрос также должен поддерживать ограничения и смещение по URL, а не по именам файлов (например, возвращать все строки, принадлежащие nth 20 URL-адресам, упорядоченным этим методом). Я пробовал упорядочивать по MAX, OVER PARTITION и т. П., Но я просто не могу понять, как это сделать.

Моя последняя попытка была сбита тем фактом, что я не могу смешать MAX () и OVER PARTITION, потому что единственный способ, которым я мог придумать, - это разделить локальный максимум каждого URL. Я подозреваю, что может быть какой-то способ сделать это с внутренним соединением, но я просто не знаю, с чего начать, потому что Мне нужно выбрать целые строки , а не только некоторые столбцы, поэтому я могу не выбирайте каждый столбец вручную.

Ответы [ 2 ]

3 голосов
/ 13 февраля 2020

Вы, кажется, хотите функцию окна в order by:

order by max(pixels) over (partition by url) desc,
         url, id
0 голосов
/ 14 февраля 2020

Если ваша версия SQLite не поддерживает функции окна, то одним из вариантов является объединение таблицы с агрегированным подзапросом, который вычисляет максимум pixel на url, и затем использование этой информации для сортировки результатов:

select t.*
from mytable t
inner join (select url, max(pixel) max_pixel from mytable group by url) m
    on t.url = m.url
order by m.max_pixel desc, url, id
...