SQL для ранжирования по условным значениям - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь добавить столбец в эту таблицу:

CREATE TABLE #NEW_HIGH (SYMBOL char(4) not null, CLOSE_DATE date not null, CLOSE_PRICE money)
INSERT INTO #NEW_HIGH VALUES ('A','01/07/2019',31.46)
INSERT INTO #NEW_HIGH VALUES ('A','01/08/2019',32.5)
INSERT INTO #NEW_HIGH VALUES ('A','01/09/2019',34.94)
INSERT INTO #NEW_HIGH VALUES ('A','01/10/2019',34.95)
INSERT INTO #NEW_HIGH VALUES ('A','01/11/2019',34.57)
INSERT INTO #NEW_HIGH VALUES ('B','01/07/2019',12.21)
INSERT INTO #NEW_HIGH VALUES ('B','01/08/2019',11.88)
INSERT INTO #NEW_HIGH VALUES ('B','01/09/2019',12.25)
INSERT INTO #NEW_HIGH VALUES ('B','01/10/2019',12.30)
INSERT INTO #NEW_HIGH VALUES ('B','01/11/2019',11.26)
INSERT INTO #NEW_HIGH VALUES ('C','01/07/2019',22.99)
INSERT INTO #NEW_HIGH VALUES ('C','01/08/2019',22.95)
INSERT INTO #NEW_HIGH VALUES ('C','01/09/2019',22.14)
INSERT INTO #NEW_HIGH VALUES ('C','01/10/2019',23.09)
INSERT INTO #NEW_HIGH VALUES ('C','01/11/2019',22.91)

... для вывода будет:

SYMBOL  CLOSE_DATE  CLOSE_PRICE RANK_BY_NEW_HI
A       1/7/2019    31.46       1
A       1/8/2019    32.5        2
A       1/9/2019    34.94       3
A       1/10/2019   34.95       4
A       1/11/2019   34.57       1
B       1/7/2019    12.21       1
B       1/8/2019    11.88       1
B       1/9/2019    12.25       2
B       1/10/2019   12.3        3
B       1/11/2019   11.26       1
C       1/7/2019    22.99       1
C       1/8/2019    22.95       1
C       1/9/2019    22.14       1
C       1/10/2019   23.09       2
C       1/11/2019   22.91       1

В основном я пытаюсь добавить4-й столбец с именем «RANK_BY_NEW_HI», который начинается со значения 1 в строке 1 и увеличивается на 1 всякий раз, когда следующая запись CLOSE_PRICE (в порядке SYMBOL и DATE) выше, и сбрасывается в 1, когда она равна или ниже предыдущей записи CLOSE_PRICE ИЛИначинается новый СИМВОЛ.

Я потратил несколько дней, пытаясь выяснить это, поэтому любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 20 января 2019

Это намного проще в SQL Server. Вы можете использовать lag() для определения пиков, совокупную сумму для определения результирующих групп, а затем row_number():

select nh.*, row_number() over (partition by symbol, high_grp order by close_date) as rank_by_new_high
from (select nh.*,
             sum(case when prev_cp < close_price then 0 else 1 end) over (partition by nh.symbol order by nh.close_date) as high_grp
      from (select nh.*,
                   lag(nh.close_price) over (partition by nh.symbol order by nh.close_date) as prev_cp
            from #new_high nh
           ) nh
     ) nh
order by symbol, close_date;

Здесь - это дБ <> скрипка.

Вы не спрашиваете моего мнения, но я бы порекомендовал вам выполнять свою работу в SQL Server, а не в MS Access. Это гораздо более функциональная база данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...