在 SQL 查询中使用动态 LIMIT Redshift
Using a dynamic LIMIT in a SQL Query Redshift
我有一个 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 是否支持此功能。我已经看到一个 Whosebug 问题,其中可以在 MySQL 中使用变量函数,但我在 Redshift 和 Netezza 中工作。有人对如何创建它有任何想法吗?谢谢!
一种方法是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;
我有一个 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 是否支持此功能。我已经看到一个 Whosebug 问题,其中可以在 MySQL 中使用变量函数,但我在 Redshift 和 Netezza 中工作。有人对如何创建它有任何想法吗?谢谢!
一种方法是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;