Как использовать Lead () и Lag (), чтобы получить первое ненулевое значение - PullRequest
1 голос
/ 22 марта 2020

У меня есть следующий запрос

SELECT tb2.event_id, 
       tb2.MENU_HINT, 
       tb2.EVENT_NAME, 
       tb2.Expr1003, 
       tb2.CountWinnerNotPrice55to89Runners0to1 AS columnCount, 
       tb2.SumWinnerNotPrice55to89Runners0to1 AS columSum, 
       lead(tb2.SumWinnerNotPrice55to89Runners0to1,1)  OVER(   order by tb2.expr1003) as lead1
FROM [dbo].[tblData2] tb2
WHERE tb2.Expr1003 = '01/01/2018 ';

и возвращает эту таблицу:

╔═══════════╦══════════════════════════╦═════════════════╦════════════╦═════════════╦══════════╦═══════╗
║ event_id  ║ MENU_HINT                ║ EVENT_NAME      ║ Expr1003   ║ columnCount ║ columSum ║ lead1 ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138466815 ║ AUS / Long (AUS) 1st Jan ║ R4 1400m Hcap   ║ 01/01/2018 ║ 1           ║ 85.00    ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138466809 ║ AUS / Long (AUS) 1st Jan ║ R1 1400m Mdn    ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138466868 ║ AUS / MBdg (AUS) 1st Jan ║ R7 1206m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138466189 ║ AUS / Inve (AUS) 1st Jan ║ R7 1400m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138466864 ║ AUS / MBdg (AUS) 1st Jan ║ R5 1406m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138386493 ║ AUS / Rand (AUS) 1st Jan ║ R2 1600m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138466862 ║ AUS / MBdg (AUS) 1st Jan ║ R4 904m Hcap    ║ 01/01/2018 ║ 0           ║ NULL     ║ 82.53 ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138386464 ║ AUS / Flem (AUS) 1st Jan ║ R5 1700m Hcap   ║ 01/01/2018 ║ 1           ║ 82.53    ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138466813 ║ AUS / Long (AUS) 1st Jan ║ R3 1400m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138386488 ║ AUS / Asct (AUS) 1st Jan ║ R9 1200m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ 57.45 ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138466522 ║ AUS / Morn (AUS) 1st Jan ║ R4 1200m Hcap   ║ 01/01/2018 ║ 1           ║ 57.45    ║ 65.00 ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138386468 ║ AUS / Flem (AUS) 1st Jan ║ R7 2800m Listed ║ 01/01/2018 ║ 1           ║ 65.00    ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138466181 ║ AUS / Inve (AUS) 1st Jan ║ R3 1010m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138466187 ║ AUS / Inve (AUS) 1st Jan ║ R6 1600m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138386486 ║ AUS / Asct (AUS) 1st Jan ║ R8 2400m Grp2   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138386480 ║ AUS / Asct (AUS) 1st Jan ║ R5 1600m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ 65.00 ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138386478 ║ AUS / Asct (AUS) 1st Jan ║ R4 1800m Grp3   ║ 01/01/2018 ║ 1           ║ 65.00    ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138386497 ║ AUS / Rand (AUS) 1st Jan ║ R4 1200m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138386476 ║ AUS / Asct (AUS) 1st Jan ║ R3 2200m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138466177 ║ AUS / Inve (AUS) 1st Jan ║ R1 1010m Mdn    ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138466856 ║ AUS / MBdg (AUS) 1st Jan ║ R1 904m Mdn     ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138466518 ║ AUS / Morn (AUS) 1st Jan ║ R2 1200m 3yo    ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138386470 ║ AUS / Flem (AUS) 1st Jan ║ R8 1400m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138386466 ║ AUS / Flem (AUS) 1st Jan ║ R6 1200m Grp3   ║ 01/01/2018 ║ 0           ║ NULL     ║ 66.51 ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138466191 ║ AUS / Inve (AUS) 1st Jan ║ R8 1400m Cup    ║ 01/01/2018 ║ 1           ║ 66.51    ║ NULL  ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138466798 ║ AUS / Tera (AUS) 1st Jan ║ R5 1125m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ 70.00 ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138466821 ║ AUS / Long (AUS) 1st Jan ║ R7 1800m Hcap   ║ 01/01/2018 ║ 1           ║ 70.00    ║ 72.44 ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════╣
║ 138386462 ║ AUS / Flem (AUS) 1st Jan ║ R4 2000m Hcap   ║ 01/01/2018 ║ 1           ║ 72.44    ║ 72.42 ║
╚═══════════╩══════════════════════════╩═════════════════╩════════════╩═════════════╩══════════╩═══════╝

Теперь я пытаюсь вычислить опережение первого ненулевого значения. значение на поле. например, для event_id = 138466815 значение columnCount равно 85. Я хочу, чтобы в поле «lead1» отображалось значение 82,53, что является следующим ненулевым значением ниже. и что потом, для event_id = ** 138386464 ** "вывод 1 покажет 57,45 (следующее ненулевое значение ниже).

Я не уверен, должен ли я передавать параметр в параметр смещения ведущая функция, но я не знаю, какой из них должен быть, может быть, что-то с Coalesce? Я не смог этого сделать. столбец lead1 для отображения:

╔═══════════╦══════════════════════════╦═════════════════╦════════════╦═════════════╦══════════╦═══════════════╗
║ event_id  ║ MENU_HINT                ║ EVENT_NAME      ║ Expr1003   ║ columnCount ║ columSum ║ lead1         ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138466815 ║ AUS / Long (AUS) 1st Jan ║ R4 1400m Hcap   ║ 01/01/2018 ║ 1           ║ 85.00    ║ 82.53         ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138466809 ║ AUS / Long (AUS) 1st Jan ║ R1 1400m Mdn    ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138466868 ║ AUS / MBdg (AUS) 1st Jan ║ R7 1206m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138466189 ║ AUS / Inve (AUS) 1st Jan ║ R7 1400m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138466864 ║ AUS / MBdg (AUS) 1st Jan ║ R5 1406m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138386493 ║ AUS / Rand (AUS) 1st Jan ║ R2 1600m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138466862 ║ AUS / MBdg (AUS) 1st Jan ║ R4 904m Hcap    ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138386464 ║ AUS / Flem (AUS) 1st Jan ║ R5 1700m Hcap   ║ 01/01/2018 ║ 1           ║ 82.53    ║ 57.45         ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138466813 ║ AUS / Long (AUS) 1st Jan ║ R3 1400m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138386488 ║ AUS / Asct (AUS) 1st Jan ║ R9 1200m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138466522 ║ AUS / Morn (AUS) 1st Jan ║ R4 1200m Hcap   ║ 01/01/2018 ║ 1           ║ 57.45    ║ 65.00         ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138386468 ║ AUS / Flem (AUS) 1st Jan ║ R7 2800m Listed ║ 01/01/2018 ║ 1           ║ 65.00    ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138466181 ║ AUS / Inve (AUS) 1st Jan ║ R3 1010m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138466187 ║ AUS / Inve (AUS) 1st Jan ║ R6 1600m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138386486 ║ AUS / Asct (AUS) 1st Jan ║ R8 2400m Grp2   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138386480 ║ AUS / Asct (AUS) 1st Jan ║ R5 1600m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138386478 ║ AUS / Asct (AUS) 1st Jan ║ R4 1800m Grp3   ║ 01/01/2018 ║ 1           ║ 65.00    ║ 66.51         ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138386497 ║ AUS / Rand (AUS) 1st Jan ║ R4 1200m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138386476 ║ AUS / Asct (AUS) 1st Jan ║ R3 2200m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138466177 ║ AUS / Inve (AUS) 1st Jan ║ R1 1010m Mdn    ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138466856 ║ AUS / MBdg (AUS) 1st Jan ║ R1 904m Mdn     ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138466518 ║ AUS / Morn (AUS) 1st Jan ║ R2 1200m 3yo    ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138386470 ║ AUS / Flem (AUS) 1st Jan ║ R8 1400m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138386466 ║ AUS / Flem (AUS) 1st Jan ║ R6 1200m Grp3   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138466191 ║ AUS / Inve (AUS) 1st Jan ║ R8 1400m Cup    ║ 01/01/2018 ║ 1           ║ 66.51    ║ 70.00         ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138466798 ║ AUS / Tera (AUS) 1st Jan ║ R5 1125m Hcap   ║ 01/01/2018 ║ 0           ║ NULL     ║ NULL          ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138466821 ║ AUS / Long (AUS) 1st Jan ║ R7 1800m Hcap   ║ 01/01/2018 ║ 1           ║ 70.00    ║ 72.44         ║
╠═══════════╬══════════════════════════╬═════════════════╬════════════╬═════════════╬══════════╬═══════════════╣
║ 138386462 ║ AUS / Flem (AUS) 1st Jan ║ R4 2000m Hcap   ║ 01/01/2018 ║ 1           ║ 72.44    ║ next not null ║
╚═══════════╩══════════════════════════╩═════════════════╩════════════╩═════════════╩══════════╩═══════════════╝

Кроме того, я не уверен, существует ли способ подсчета количества строк между первым ненулевым значением в columnCount и вторым ненулевым значением. Например, для первого счетчика 7, для второго - 3, а для третьего - 1.

1 Ответ

1 голос
/ 22 марта 2020

Кажется, вам нужно следующее значение где columnCount = 1, поэтому разделите по этому столбцу:

   lead(tb2.SumWinnerNotPrice55to89Runners0to1, 1) over
       (partition by columnCount
        order by tb2.expr1003
       ) as lead1
...