Проверка значений строк в последовательных строках с использованием SQL Server - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть набор данных, как показано ниже. Я хочу проверить последовательно значения строки в столбце L / P.

В качестве примера для tradedate между 2019-02-12 и 2019-02-14 L / P возвращаемые значения были 1 0 0. для того же шаблона были записи для tradedate между 2019-02-16 и 2019-02-18.

Как проверить этот же шаблон в столбце L / P, используя SQL Сервер?

tradedate   price   lost / profit   L/P
----------  -----   ------------   ----
2019-02-11  150.00   0.00            1
2019-02-12  330.00   180.00          1
2019-02-13  329.00   -1.00           0
2019-02-14  151.00   -178.00         0
2019-02-15  148.00   -3.00           0
2019-02-16  329.00   181.00          1
2019-02-17  326.00   -3.00           0
2019-02-18  146.00   -180.00         0

Оператор DDL для создания таблицы

CREATE TABLE dbo.Ticker
(
     symbol    VARCHAR(10)    NOT NULL,
     tradedate DATE           NOT NULL,
     price     NUMERIC(12, 2) NOT NULL,

     CONSTRAINT PK_Ticker
         PRIMARY KEY (symbol, tradedate)
);
GO

INSERT INTO dbo.Ticker(symbol, tradedate, price) 
VALUES
  ('STOCK1', '20190211', 150.00),
  ('STOCK1', '20190212', 330.00), 
  ('STOCK1', '20190213', 329.00),  
  ('STOCK1', '20190214', 151.00),  
  ('STOCK1', '20190215', 148.00),  
  ('STOCK1', '20190216', 329.00),  
  ('STOCK1', '20190217', 326.00),  
  ('STOCK1', '20190218', 146.00);

SQL запрос на получение вышеуказанного набора данных

SELECT  
    tradedate,
    price,
    ((LAG(price, 1, price) OVER (ORDER BY tradedate)) - price) * -1 AS 'lost / profit',
    CASE WHEN ((LAG(price, 1, 0) OVER (ORDER BY tradedate)) - price) < 0 THEN 1 ELSE 0 END AS 'L / P'
FROM    
    Ticker t
WHERE   
    tradedate BETWEEN '2019-02-11' AND '2019-02-18'
````

1 Ответ

0 голосов
/ 04 апреля 2020

Попробуйте использовать функцию агрегирования, например STRING_AGG():

( ОБНОВЛЕНО ):

SELECT 
     STRING_AGG([L / P], ' ') 
FROM
(SELECT tradedate
            ,price 
            ,((LAG(price, 1, price) OVER (ORDER BY tradedate)) - price) * -1 AS 'lost / profit'
            ,CASE WHEN ((LAG(price, 1, 0) OVER (ORDER BY tradedate)) - price) < 0 THEN 1 ELSE 0 END AS 'L / P'
    FROM    Ticker t
    WHERE   tradedate BETWEEN '2019-02-12' AND '2019-02-14')
EXCEPT
SELECT 
     STRING_AGG([L / P], ' ') 
FROM
(SELECT tradedate
            ,price 
            ,((LAG(price, 1, price) OVER (ORDER BY tradedate)) - price) * -1 AS 'lost / profit'
            ,CASE WHEN ((LAG(price, 1, 0) OVER (ORDER BY tradedate)) - price) < 0 THEN 1 ELSE 0 END AS 'L / P'
    FROM    Ticker t
    WHERE   tradedate BETWEEN '2019-02-16' AND '2019-02-18')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...