SQL查询获取具有最长字符串的行

时间:2018-09-26 19:05:07

标签: sql postgresql

给出此查询:

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"

我将如何通过vid和basevid返回具有最长应用字符串或最长app_length的记录?

我需要的结果是:

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"

该表有4000万条记录,因此它也必须快速。

1 个答案:

答案 0 :(得分:1)

您可以使用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)上使用索引会更快。