【发布时间】:2019-04-02 01:07:54
【问题描述】:
我有一个使用 ROW_NUMBER() 和 PARTITION BY 的查询以及基于日期列的订单。我想知道的是,如果第二个最大值位于位置 1 且当前最大值位于位置 250,是否可以限制这一点并仅返回匹配的 col1。
SELECT t1.col1, t1.col_date, t1.col_val, t1.rno FROM (
SELECT col1, col_date, col_val, count(*), ROW_NUMBER() OVER (PARTITION BY col1 order by col_date ASC) as rno
FROM table_one
INNER JOIN
table_two
ON
table_one.id = table_one_id
WHERE col1 in (
SELECT
col1
FROM
table_one
INNER JOIN table_two on table_one.id = table_one_id
GROUP
by table_one.id
HAVING
COUNT(*) >= 250
)
GROUP BY col1, col_date, col_val
) t1
WHERE t1.rno < 250
GROUP BY t1.col1, t1.col_date, t1.col_val, t1.rno
ORDER BY t1.col1, t1.col_date;
IE-
col1 | col_date | col_val | rno
--------+----------------------------+--------+-----
ABC | 2018-07-18 15:27:35.394051 | 999 | 1
...
ABC | 2019-03-24 15:27:34.78493 | 1000 | 250
XYZ | 2018-07-18 15:27:35.394051 | 900 | 1
...
XYZ | 2019-03-24 15:27:34.78493 | 1001 | 250
如果 col_val 是 rno 1 处的第二个最大值并且 col_val 是 rno 250 处的最大值,则两者都会返回。
[更新]
为清楚起见:两个表。 table_one 是股票代码列表。 table_two 是历史价格列表。当前查询从 table_one 中选择交易品种,并连接来自 table_two 的历史价格,每个交易品种有 250 多条记录,rno 截断为 250,因此输出将如下所示。
symbol | market_close_date | close | rno
--------+----------------------------+--------+-----
FAKE | 2018-07-18 15:27:35.394051 | 250.0 | 1
FAKE | 2018-07-19 15:27:35.391866 | 249.0 | 2
FAKE | 2018-07-20 15:27:35.389615 | 248.0 | 3
FAKE | 2018-07-21 15:27:35.38741 | 247.0 | 4
FAKE | 2018-07-22 15:27:35.3852 | 246.0 | 5
FAKE | 2018-07-23 15:27:35.383099 | 245.0 | 6
FAKE | 2018-07-24 15:27:35.380934 | 244.0 | 7
FAKE | 2018-07-25 15:27:35.378828 | 243.0 | 8
FAKE | 2018-07-26 15:27:35.376769 | 242.0 | 9
...
FAKE | 2019-03-24 15:27:34.78493 | 1000.0 | 250
TEST | 2018-07-18 15:27:35.396232 | 250.0 | 1
...
TEST | 2018-07-18 15:27:35.64352 | 50.0 | 250
如果 rno 1 > 2...249 并且 rno 1...249
【问题讨论】:
-
展示一些示例数据对您的问题有很大帮助。
-
在最外面的
WHERE子句中你能说WHERE t1.rno =1 OR t1.rno = 250吗?你能稍微澄清一下第二个最大值的定义吗? -
J Spratt,请允许我澄清一下。我在问我是否可以做以下事情。 rno 1 处的 col_val 大于到 249 的所有值,并且 rno 250 是从 1 到 250 的最大值。因此,在第一个实例(第二个最大值)中,从 2 到 249 的所有值都将小于 999,而 250 处的值(1000) 将是最大值。任何大于 rno1 或 rno250 的 col_val 2...249 都不符合条件。
标签: sql postgresql window-functions