Подсчитайте количество последующих строк с тем же значением, что и значение в первой строке - PullRequest
1 голос
/ 07 июня 2019

У меня есть следующая базовая таблица:

+------------+--------+--------+--------+--------+
|    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 на основе этого.Затем запрос сверху, где он суммирует значение для строк, которые соответствуют критерию: дата> = первая дата со значением 0 (для каждого столбца).

1 Ответ

2 голосов
/ 07 июня 2019

Это запрос группы и островов, но он стал более сложным, потому что у вас есть несколько столбцов для обработки.

Я бы порекомендовал разницу номера строки и даты для определения группы. Затем оконная функция для получения значений:

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. Для другой даты используйте подзапрос.

...