繁体   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