簡體   English   中英

計算與第一行中的值相同的后續行數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM