Использование динамического LIMIT в SQL-запросе Redshift - PullRequest
0 голосов
/ 04 июня 2018

У меня есть запрос Redshift и Netezza, где COUNT(*) увеличивается, когда я его запускаю, так как большинство таблиц добавляют строки с большим количеством продаж и т. Д. В любом случае, я ищу верхние 20% по цене, поэтому яиспользуя ORDER BY price, затем изменяя лимит, выполняя ментальную математику, чтобы получить верхние 20%, т.е. если COUNT(*)=10,000, тогда я добавлю статический LIMIT 2000.Завтра, может быть, это будет 12 000 строк, тогда мне нужно будет запустить COUNT(*) и снова изменить LIMIT 2400.Это явно не масштабируемо.

Я пытаюсь отредактировать запрос, чтобы включить динамический лимит, ищу верхние 20% и легко меняюсь между процентами: 5%, 10% и т. Д. Так что неважноколичество строк, я получаю последовательные результаты.

Пример запроса ниже:

SELECT
 * 
FROM orders
WHERE
 sale_date >= '2018-01-01'
ORDER BY 
 price DESC
LIMIT 2000

Я хотел бы иметь что-то, что больше похоже на:

SELECT
 * 
FROM orders
WHERE
 sale_date >= '2018-01-01'
ORDER BY 
 price DESC
LIMIT (SELECT COUNT(*) * 0.2 FROM orders)

Неуверен, что Redshift / Netezza поддерживает эту функцию.Я видел ОДИН вопрос StackOverflow, где это было возможно в MySQL, используя переменную функцию, но я работаю в Redshift и Netezza.У кого-нибудь есть идеи как это создать?Спасибо!

1 Ответ

0 голосов
/ 04 июня 2018

Один метод: row_number() и count(*):

SELECT o.* 
FROM (SELECT o.*,
             ROW_NUMBER() OVER (ORDER BY price DESC) as seqnum,
             COUNT(*) OVER () as cnt
      FROM orders o
      WHERE sale_date >= '2018-01-01'
     ) o
WHERE seqnum <= cnt * 0.2
ORDER BY price DESC;

Вам не нужно использовать две функции.Один будет делать.Например:

SELECT o.* 
FROM (SELECT o.*,
             PERCENT_RANK() OVER (ORDER BY price DESC) p
      FROM orders o
      WHERE sale_date >= '2018-01-01'
     ) o
WHERE p <= 0.2
ORDER BY price DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...