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()», которая не созд ...