我想在一個很長的時間序列中找到一個最小值,但是我不想用 2000 個點或只有 1 行來顯示整個系列,而是想用最小值之前和之后的值來顯示20 行profit,
結果示例:
company date_num, profit min
A EPOCH 4 2
A EPOCH 2 2 # show 10 results before and after 2, for A.
A EPOCH 16 2
C EPOCH 9 9
C EPOCH 11 9
因此,每家公司,找到最小值,然后列印最小值周圍的“區域”,例如前后 10 個結果。
目標是用一條顯示最小值的線列印最小值的區域。
這給了我一個單行結果:
WITH BS AS (
SELECT date_num, company,
ROW_NUMBER() OVER (PARTITION BY company ORDER BY profit desc) as rn
FROM history
WHERE company in ['a','b','c']
)
SELECT date_num, company
FROM BS
WHERE rn = 1
編輯:
為了澄清,感謝這里的評論,如果最少 2 是在 8 月 15 日,我想顯示 8 月 10 日至 20 日之間的所有結果。
date_time是一個數字日期,它將日期以天為單位顯示為int以秒為單位的數字。(時代)
uj5u.com熱心網友回復:
你需要兩個步驟:
- 找到最少的行
- 找到他們周圍的行
為此,用 確定最小利潤,MIN OVER并用 為行編號ROW_NUMBER。因此,您可以選擇行號與最小行的行號相差不超過 10 的所有行。
WITH bs AS
(
SELECT
company, date_num, profit,
MIN(profit) OVER (PARTITION BY company) AS min_profit,
ROW_NUMBER() OVER (PARTITION BY company ORDER BY date_num) AS rn
FROM history
WHERE company IN ('A', 'B', 'C')
)
SELECT company, date_num, profit
FROM bs
WHERE EXISTS
(
SELECT NULL
FROM bs bsmin
WHERE bsmin.profit = bsmin.min_profit
AND bsmin.company = bs.company
AND ABS(bs.rn - bsmin.rn) <= 10
)
ORDER BY company, date_num;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/430058.html
標籤:sql PostgreSQL
