Найти дату начала и окончания курсовой разницы - PullRequest
0 голосов
/ 16 апреля 2019

Предложите хороший запрос sql, чтобы найти дату начала и окончания курсовой разницы

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

Sample_table

transaction_date  stock
2018-12-01          10
2018-12-02          10
2018-12-03          20
2018-12-04          20
2018-12-05          20
2018-12-06          20
2018-12-07          20
2018-12-08          10
2018-12-09          10
2018-12-10          30

Ожидаемый результат должен быть

Start_date     end_date      stock
2018-12-01     2018-12-02     10
2018-12-03     2018-12-07     20
2018-12-08     2018-12-09     10
2018-12-10     null           30

Ответы [ 4 ]

5 голосов
/ 16 апреля 2019

Это проблема разрыва и острова. Для этого вы можете использовать row_numer и group by.

select  t.stock, min(transaction_date), max(transaction_date)
from (
   select row_number() over (order by transaction_date) -
      row_number() over (partition by stock order by transaction_date) grp,
      transaction_date,
      stock
   from data
) t
group by t.grp, t.stock

В следующем DBFIDDLE DEMO Я также решаю значение null последней группы, но основная идея поиска последовательных строк основана на приведенном выше запросе.

Вы можете проверить этот для объяснения этого решения.

1 голос
/ 16 апреля 2019

Вы можете попробовать ниже, используя row_number()

select stock,min(transaction_date) as start_date,
case when min(transaction_date)=max(transaction_date) then null else max(transaction_date) end as end_date
from
(
select *,row_number() over(order by transaction_date)-
row_number() over(partition by stock order by transaction_date) as rn
from t1
)A group by stock,rn
0 голосов
/ 16 апреля 2019

Вы можете попробовать с функциями LEAD, LAG, как показано ниже:

select currentStockDate as startDate, 
LEAD(currentStockDate,1) as EndDate,
currentStock
from
(select *
from
(select 
LAG(transaction_date,1) over(order by transaction_date) as prevStockDate,
 transaction_date as CurrentstockDate,
LAG(stock,1) over(order by transaction_date) as prevStock,
stock as currentStock
from sample_table) as t
where (prevStock <> currentStock) or (prevStock is null)
) as t2
0 голосов
/ 16 апреля 2019

Попробуйте использовать GROUP BY с MIN и MAX:

SELECT
  stock,
  MIN(transaction_date) Start_date,
  CASE WHEN COUNT(*)>1 THEN MAX(transaction_date) END end_date      
FROM Sample_table
GROUP BY stock
ORDER BY stock
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...