PostgreSQL: первые n записей на каждый элемент в той же таблице

| uId | title | amount | makers | widgets | 1 richard 998 xcorp sprocket 2 swiss 995 ycorp framitz 3 ricky 90 zcorp flobber 4 ricky2 798 xcorp framitz 1 lilrick 390 xcorp sprocket 1 brie 200 mcorp gullywok 1 richard 190 rcorp flumitz 1 brie 490 bcorp sprocket 
и т. д.
Я пытаюсь получить только 3 записи 9X_pgsql на makers, первые 3 записи amounts и widgets, которые они создали
Вот 9X_top-n что у меня:
SELECT amount, makers FROM (SELECT amount, makers, (SELECT count(*) FROM entry as t2 WHERE t2.amount = t1.amount and t2.makers >= t1.makers) AS RowNum FROM entry as t1 ) t3 WHERE t3.RowNum<4 order by amount; 

Возвращает ли это то, что мне 9X_sql-postgres действительно нужно? Есть ли лучший способ 9X_groupwise-maximum сделать это? Большинство способов, которые 9X_sql-query я видел для этого, - это объединение и т. Д. В 9X_pgsql разрозненных таблицах, вся необходимая мне 9X_postgresql информация находится на одной таблице.
Ожидаемый 9X_pgsql результат:
| uId | title | amounts | makers | widgets | 1 richard 998 xcorp sprocket 41 swiss 995 xcorp widget 989 richard 989 xcorp sprocket 22 swiss 995 ycorp framitz 92 swiss 990 ycorp widget 456 swiss 895 ycorp flobber 344 ricky 490 zcorp flobber 32 tricky 480 zcorp flobber 13 ricky 470 zcorp flobber 

и т. д.
Порядок makers не так важен, как 9X_postgres получение трех первых amounts для каждого makers и предоставленного 9X_select-statement ими widgets. Количество makers установлено, всегда будет 9X_sql x makers
9
0
1
Общее количество ответов: 1

Ответ #1

Ответ на вопрос: PostgreSQL: первые n записей на каждый элемент в той же таблице

SELECT * FROM ( SELECT uid, title, amount, maker, widgets, rank() over (partition by maker order by amount desc) as rank FROM entry ) t WHERE rank <= 3 
9X_sql-select
23
3

  • Ты прав. Другим решением может быть «density_rank()», которая не созд ...