[英]Count the number of subsequent rows with the same value as the value in the first row
我有以下基本表:
+------------+--------+--------+--------+--------+
| date | CHFUSD | CHFJPY | CHFEUR | CHFGBP |
+------------+--------+--------+--------+--------+
| 24/03/2019 | 1.0016 | 0.009 | 1.1349 | 1.3327 |
| 23/03/2019 | 1.0016 | 0.009 | 1.1349 | 1.3327 |
| 22/03/2019 | 1.0016 | 0.009 | 1.1349 | 1.3209 |
| 21/03/2019 | 1.0016 | 0.0089 | 1.1349 | 1.3209 |
| 20/03/2019 | 1.0016 | 0.0089 | 1.1348 | 1.3209 |
| 19/03/2019 | 1.0016 | 0.0089 | 1.1348 | 1.3209 |
| 18/03/2019 | 0.998 | 0.0089 | 1.1359 | 1.3209 |
| 17/03/2019 | 1.0016 | 0.009 | 1.1349 | 1.3327 |
| 16/03/2019 | 1.0035 | 0.009 | 1.1348 | 1.3303 |
| 15/03/2019 | 0.998 | 0.0089 | 1.1359 | 1.3209 |
| 14/03/2019 | 0.998 | 0.0089 | 1.1359 | 1.3209 |
| 13/03/2019 | 0.998 | 0.0089 | 1.1359 | 1.3209 |
+------------+--------+--------+--------+--------+
這些是外匯匯率,顯示四種貨幣對的每日匯率。 我現在正在尋找一種方法來檢查連續多少天交付的匯率相同。
查詢的輸出應如下所示:
+------------+--------+--------+--------+--------+
| date | CHFUSD | CHFJPY | CHFEUR | CHFGBP |
+------------+--------+--------+--------+--------+
| 24/03/2019 | 6 | 3 | 4 | 2 |
+------------+--------+--------+--------+--------+
如果日期會使練習復雜化,則它不是必需的列。 有人對如何完成這項工作有想法嗎? 我在考慮一個窗口函數,該函數將值與先前的值進行比較,並根據該值返回0/1。 然后是一個查詢,該查詢在上面對符合條件的行的值求和:date> = first date,值為0(每列)。
這是一個島查詢,但由於要處理多個列而變得更加復雜。
我建議使用行號和日期的區別來定義組。 然后是一個窗口函數來獲取值:
select t.*,
count(*) over (partition by chfusd, dateadd(day, - seqnum_chfusd, date)) as cnt_usd,
count(*) over (partition by chfjpy, dateadd(day, - seqnum_chfjpy, date)) as cnt_jpy,
count(*) over (partition by chfeur, dateadd(day, - seqnum_chfeur, date)) as cnt_eur,
count(*) over (partition by chfgbp, dateadd(day, - seqnum_chgbp, date)) as cnt_gbp
from (select t.*,
row_number() over (partition by chfusd order by date) as seqnum_chfusd,
row_number() over (partition by chfjpy order by date) as seqnum_chfjpy,
row_number() over (partition by chfeur order by date) as seqnum_chfeur,
row_number() over (partition by chfgbp order by date) as seqnum_chfgbp
from t
) t;
如果您希望此日期為最近的日期,則添加select top (1)
並按order by date desc
。 對於另一個日期,請使用子查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.