在SQL查询Redshift中使用动态LIMIT

时间:2018-06-04 19:01:38

标签: sql sql-order-by limit amazon-redshift netezza

我有一个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 :(得分:5)

一种方法是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;