Автоматизация повторяющихся союзов - PullRequest
0 голосов
/ 16 мая 2019

Я выполняю запрос, подобный этому:

SELECT id FROM table
WHERE table.type IN (1, 2, 3)
LIMIT 15

Это возвращает случайную выборку.У меня может быть 7 предметов из class_1 и 3 предмета из class_2.Я хотел бы вернуть ровно 5 элементов из каждого класса, и работает следующий код:

SELECT id FROM (
SELECT id, type FROM table WHERE type = 1 LIMIT 5
UNION
SELECT id, type FROM table WHERE type = 2 LIMIT 5
UNION ...
ORDER BY type ASC)

Это становится громоздким, если я хочу случайную выборку из десяти классов, а не только из трех.Каков наилучший способ сделать это?

(я использую Presto / Hive, поэтому любые советы для этих двигателей будут полезны).

Ответы [ 2 ]

3 голосов
/ 16 мая 2019

Используйте такую ​​функцию, как row_number, чтобы сделать это. Это делает выбор независимым от количества типов.

SELECT id,type
FROM (SELECT id, type, row_number() over(partition by type order by id) as rnum --adjust the partition by and order by columns as needed
      FROM table
     ) T 
WHERE rnum <= 5 
1 голос
/ 16 мая 2019

Я бы настоятельно рекомендовал добавить ORDER BY.В любом случае, вы можете сделать что-то вроде:

with
x as (
  select
    id,
    type,
    row_number() over(partition by type order by id) as rn
  from table
)
select * from x where rn <= 5
...