【问题标题】:Using a dynamic LIMIT in a SQL Query Redshift在 SQL 查询 Redshift 中使用动态 LIMIT
【发布时间】:2018-11-14 04:14:28
【问题描述】:

我有一个 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 工作。有人对如何创建这个有任何想法吗?谢谢!

【问题讨论】:

  • 我会首先检查您的初始方法。它可以在没有任何解决方法的情况下工作demo
  • @lad2025 最初在我知道总行数的静态表上正常工作,但随着表的持续增长,我必须不断找到总计数,然后调整 LIMIT我不想这样做,因此这个 StackOverflow 问题:)

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2014-10-08
    • 1970-01-01
    相关资源
    最近更新 更多