SQL-запрос получает строку с самой длинной строкой - PullRequest
0 голосов
/ 26 сентября 2018

Учитывая этот запрос:

SELECT
    LENGTH(app) AS app_length, 
    ROW_NUMBER() 
OVER (
    PARTITION BY 
        vid, basevid
    ORDER BY 
        vid, basevid, LENGTH(app) 
    ) AS j,
    vid, basevid, app
FROM DATA4 WHERE hol = '40008'

, который возвращает эти данные:

app_length,j,vid,basevid,app
2,1,6260,3174,"AT"
2,2,6260,3174,"AT"
9,3,6260,3174,"AT; TH125"
9,4,6260,3174,"AT; TH125"
18,5,6260,3174,"AT; TH125 gasoline"
18,6,6260,3174,"AT; TH125 gasoline"
2,1,6261,3175,"AT"
2,2,6261,3175,"AT"
9,3,6261,3175,"AT; TH125"
9,4,6261,3175,"AT; TH125"
18,5,6261,3175,"AT; TH125 gasoline"
18,6,6261,3175,"AT; TH125 gasoline"
2,1,6260,3174,"AT"
2,2,6260,3174,"AT"
9,3,6260,3174,"AT; TH125"
9,4,6260,3174,"AT; TH125"
18,5,6260,3174,"AT; TH125 gasoline"
18,6,6260,3174,"AT; TH125 gasoline"
2,1,6262,3176,"AT"
2,2,6262,3176,"AT"
9,3,6262,3176,"AT; TH125"
9,4,6262,3176,"AT; TH125"
18,5,6262,3176,"AT; TH125 gasoline"
18,6,6262,3176,"AT; TH125 gasoline"
2,1,6262,3176,"AT"
2,2,6262,3176,"AT"
9,3,6262,3176,"AT; TH125"
9,4,6262,3176,"AT; TH125"
18,5,6262,3176,"AT; TH125 gasoline"
18,6,6262,3176,"AT; TH125 gasoline"
2,1,6262,3176,"AT"
2,2,6262,3176,"AT"
9,3,6262,3176,"AT; TH125"
9,4,6262,3176,"AT; TH125"
18,5,6262,3176,"AT; TH125 gasoline"
18,6,6262,3176,"AT; TH125 gasoline"
2,1,10182,4599,"AT"
9,2,10182,4599,"AT; TH125"
18,3,10182,4599,"AT; TH125 gasoline"
2,1,10328,4651,"AT"
9,2,10328,4651,"AT; TH125"
18,3,10328,4651,"AT; TH125 gasoline"
2,1,9830,4453,"AT"
2,2,9830,4453,"AT"
9,3,9830,4453,"AT; TH125"
9,4,9830,4453,"AT; TH125"
18,5,9830,4453,"AT; TH125 gasoline"
18,6,9830,4453,"AT; TH125 gasoline"
2,1,9830,4453,"AT"
2,2,9830,4453,"AT"
9,3,9830,4453,"AT; TH125"
9,4,9830,4453,"AT; TH125"
18,5,9830,4453,"AT; TH125 gasoline"
18,6,9830,4453,"AT; TH125 gasoline"
2,1,4650,2560,"AT"
2,2,4650,2560,"AT"
9,3,4650,2560,"AT; TH125"
9,4,4650,2560,"AT; TH125"
18,5,4650,2560,"AT; TH125 gasoline"
18,6,4650,2560,"AT; TH125 gasoline"

Как бы я вернул запись с самой длинной строкой приложения или самой длинной app_length по vid и basevid?

Мне нужны следующие результаты:

app_length,j,vid,basevid,app
18,6,6261,3175,"AT; TH125 gasoline"
18,6,6260,3174,"AT; TH125 gasoline"
18,6,6262,3176,"AT; TH125 gasoline"
18,3,10182,4599,"AT; TH125 gasoline"
18,3,10328,4651,"AT; TH125 gasoline"
18,6,9830,4453,"AT; TH125 gasoline"
18,6,4650,2560,"AT; TH125 gasoline"

В таблице 40 миллионов записей, поэтому это тоже должно быть быстро.

1 Ответ

0 голосов
/ 26 сентября 2018

Вы можете использовать distinct on:

SELECT DISTINCT ON (hol, vid, base_vid) d.*
FROM DATA4 d
WHERE hol = '40008'
ORDER BY hol, vid, basevid, LENGTH(app) DESC;

Это, вероятно, самый быстрый метод в Postgres.Это было бы быстрее с индексом на (hol, vid, basevid, LENGTH(app) desc).

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