Получить сумму (столбец) over (разделить на другие столбцы) с подмножеством раздела - PullRequest
0 голосов
/ 24 марта 2020

Мне нужно сделать сумму всех элементов в "count2" для разделов, скриншот ниже показывает лучше, чем я мог бы объяснить, но мне нужно сложить элементы в этом столбце и затем вычесть их из столбца "Lead2" . У меня следующий запрос:

SELECT td.EVENT_ID AS event_id, 
       td.MENU_HINT AS race, 
       td.EVENT_NAME AS event, 
       td.expr1003 AS [date], 
       td.raceno AS [race number],
       td.countwinnerprice5to8 AS [count1],
       td.sumwinnerprice5to8 AS [sum1],
       td.countwinnernotprice5to8 AS [count2],
       td.sumwinnernotprice5to8 AS [sum2],
       lead(td.sumwinnerprice5to8,1) OVER(PARTITION BY countwinnerprice5to8  Order by expr1003 desc, raceno desc, event_id desc ) as lead2,
       sum(td.countwinnernotprice5to8) OVER(PARTITION BY countwinnernotprice5to8  Order by expr1003 desc, raceno desc, event_id DESC rows between 1 following and unbounded following       ) as countlead2
FROM tbldata5 td
WHERE 
menu_hint LIKE '%Flem%'
ORDER BY expr1003 desc, raceno desc, event_id desc

, который возвращает эту таблицу:

╔═══════════╦═══════════════════════════╦═════════════════╦════════════╦═════════════╦════════╦══════╦════════╦═══════╦═══════╦════════════╗
║  event_id ║ race                      ║ event           ║ date       ║ race number ║ count1 ║ sum1 ║ count2 ║ sum2  ║ lead2 ║ countlead2 ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145719665 ║ AUS / Flem (AUS) 21st Jul ║ R9 1000m Hcap   ║ 2018-07-21 ║ 9           ║ 0      ║ NULL ║ 1      ║ 7.40  ║ NULL  ║ 1          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145719663 ║ AUS / Flem (AUS) 21st Jul ║ R8 2000m Hcap   ║ 2018-07-21 ║ 8           ║ 0      ║ NULL ║ 0      ║ NULL  ║ NULL  ║ 0          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145719661 ║ AUS / Flem (AUS) 21st Jul ║ R7 1600m 3yo    ║ 2018-07-21 ║ 7           ║ 0      ║ NULL ║ 1      ║ 6.22  ║ NULL  ║ 2          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145719659 ║ AUS / Flem (AUS) 21st Jul ║ R6 1100m 3yo    ║ 2018-07-21 ║ 6           ║ 0      ║ NULL ║ 1      ║ 7.60  ║ NULL  ║ 3          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145719657 ║ AUS / Flem (AUS) 21st Jul ║ R5 1800m 2yo    ║ 2018-07-21 ║ 5           ║ 0      ║ NULL ║ 1      ║ 7.69  ║ NULL  ║ 4          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145719655 ║ AUS / Flem (AUS) 21st Jul ║ R4 1200m Hcap   ║ 2018-07-21 ║ 4           ║ 0      ║ NULL ║ 1      ║ 5.90  ║ NULL  ║ 5          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145719653 ║ AUS / Flem (AUS) 21st Jul ║ R3 2500m Hcap   ║ 2018-07-21 ║ 3           ║ 0      ║ NULL ║ 0      ║ NULL  ║ NULL  ║ 0          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145719651 ║ AUS / Flem (AUS) 21st Jul ║ R2 1700m Hcap   ║ 2018-07-21 ║ 2           ║ 1      ║ 6.67 ║ 1      ║ 6.56  ║ 8.00  ║ 6          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145719649 ║ AUS / Flem (AUS) 21st Jul ║ R1 1400m 3yo    ║ 2018-07-21 ║ 1           ║ 0      ║ NULL ║ 0      ║ NULL  ║ NULL  ║ 0          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145210614 ║ AUS / Flem (AUS) 7th Jul  ║ R9 1200m Listed ║ 2018-07-07 ║ 9           ║ 0      ║ NULL ║ 1      ║ 5.26  ║ NULL  ║ 7          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145210612 ║ AUS / Flem (AUS) 7th Jul  ║ R8 1600m Listed ║ 2018-07-07 ║ 8           ║ 1      ║ 8.00 ║ 2      ║ 15.42 ║ 5.64  ║ 2          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145210610 ║ AUS / Flem (AUS) 7th Jul  ║ R7 1200m Listed ║ 2018-07-07 ║ 7           ║ 0      ║ NULL ║ 0      ║ NULL  ║ NULL  ║ 0          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145210608 ║ AUS / Flem (AUS) 7th Jul  ║ R6 2600m Hcap   ║ 2018-07-07 ║ 6           ║ 0      ║ NULL ║ 2      ║ 12.65 ║ NULL  ║ 4          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145210606 ║ AUS / Flem (AUS) 7th Jul  ║ R5 1600m Listed ║ 2018-07-07 ║ 5           ║ 0      ║ NULL ║ 0      ║ NULL  ║ NULL  ║ 0          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145210604 ║ AUS / Flem (AUS) 7th Jul  ║ R4 1600m 3yo    ║ 2018-07-07 ║ 4           ║ 0      ║ NULL ║ 1      ║ 5.27  ║ NULL  ║ 8          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145210602 ║ AUS / Flem (AUS) 7th Jul  ║ R3 1400m Hcap   ║ 2018-07-07 ║ 3           ║ 1      ║ 5.64 ║ 1      ║ 7.68  ║ 5.51  ║ 9          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145210600 ║ AUS / Flem (AUS) 7th Jul  ║ R2 2000m Hcap   ║ 2018-07-07 ║ 2           ║ 0      ║ NULL ║ 0      ║ NULL  ║ NULL  ║ 0          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 145210598 ║ AUS / Flem (AUS) 7th Jul  ║ R1 1600m 3yo    ║ 2018-07-07 ║ 1           ║ 0      ║ NULL ║ 3      ║ 21.97 ║ NULL  ║ 3          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 144827118 ║ AUS / Flem (AUS) 23rd Jun ║ R9 1100m Hcap   ║ 2018-06-23 ║ 9           ║ 0      ║ NULL ║ 1      ║ 5.33  ║ NULL  ║ 10         ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 144827116 ║ AUS / Flem (AUS) 23rd Jun ║ R8 1600m Hcap   ║ 2018-06-23 ║ 8           ║ 0      ║ NULL ║ 1      ║ 6.67  ║ NULL  ║ 11         ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 144827114 ║ AUS / Flem (AUS) 23rd Jun ║ R7 1400m Hcap   ║ 2018-06-23 ║ 7           ║ 0      ║ NULL ║ 0      ║ NULL  ║ NULL  ║ 0          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 144827112 ║ AUS / Flem (AUS) 23rd Jun ║ R6 1600m 3yo    ║ 2018-06-23 ║ 6           ║ 0      ║ NULL ║ 2      ║ 13.03 ║ NULL  ║ 6          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 144827110 ║ AUS / Flem (AUS) 23rd Jun ║ R5 2520m Hcap   ║ 2018-06-23 ║ 5           ║ 0      ║ NULL ║ 2      ║ 14.56 ║ NULL  ║ 8          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 144827108 ║ AUS / Flem (AUS) 23rd Jun ║ R4 1400m Hcap   ║ 2018-06-23 ║ 4           ║ 1      ║ 5.51 ║ 3      ║ 20.44 ║ 7.80  ║ 6          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 144827106 ║ AUS / Flem (AUS) 23rd Jun ║ R3 1100m 3yo    ║ 2018-06-23 ║ 3           ║ 0      ║ NULL ║ 2      ║ 11.94 ║ NULL  ║ 10         ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 144827104 ║ AUS / Flem (AUS) 23rd Jun ║ R2 1400m Hcap   ║ 2018-06-23 ║ 2           ║ 0      ║ NULL ║ 1      ║ 7.29  ║ NULL  ║ 12         ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 144827102 ║ AUS / Flem (AUS) 23rd Jun ║ R1 1400m 2yo    ║ 2018-06-23 ║ 1           ║ 0      ║ NULL ║ 3      ║ 19.39 ║ NULL  ║ 9          ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 144506971 ║ AUS / Flem (AUS) 9th Jun  ║ R9 1000m 3yo    ║ 2018-06-09 ║ 9           ║ 0      ║ NULL ║ 1      ║ 7.97  ║ NULL  ║ 13         ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 144506969 ║ AUS / Flem (AUS) 9th Jun  ║ R8 2000m 3yo    ║ 2018-06-09 ║ 8           ║ 0      ║ NULL ║ 3      ║ 20.10 ║ NULL  ║ 12         ║
╠═══════════╬═══════════════════════════╬═════════════════╬════════════╬═════════════╬════════╬══════╬════════╬═══════╬═══════╬════════════╣
║ 144506967 ║ AUS / Flem (AUS) 9th Jun  ║ R7 1400m Hcap   ║ 2018-06-09 ║ 7           ║ 0      ║ NULL ║ 1      ║ 5.71  ║ NULL  ║ 14         ║
╚═══════════╩═══════════════════════════╩═════════════════╩════════════╩═════════════╩════════╩══════╩════════╩═══════╩═══════╩════════════╝

Таблица упорядочена по дате / номер гонки и event_id. это должен быть последний порядок таблицы.

Мне нужно сложить счетчик каждой строки в count2 в диапазоне между count1 элементами .

Это может быть легче понять с графикой c (нажмите, чтобы увеличить).

enter image description here

Так что в основном то, что мне нужно Для этого нужно суммировать, что находится на синих прямоугольниках, а затем вычесть это значение в ненулевую строку из lead2 и добавить в countlead2 . Я даже могу обработать его с помощью временной таблицы или создать новый столбец, куда его можно вставить, чтобы он мог быть чище и рассчитан позже. но я не знаю, как суммировать счетчик синего прямоугольника.

Я пробовал с комбинациями групповых наборов и различными комбинациями сумм по разделам. но я не могу сделать то, что мне нужно. Я думаю, что разделение путем - это путь к go.

До сих пор я пытался с 1 следующим и неограниченным следующим, чтобы попытаться получить данные, которые я хочу, но кажется, что go выходит за пределы , Есть ли способ получить границу, чтобы быть переменной? или выбрать последнее следующее как первое из следующего? И кажется, что предыдущий / следующий не работает с нужным мне разделом.

1 Ответ

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

Один из способов состоит в том, чтобы сделать это в несколько этапов, а не пытаться делать все это одним оператором SELECT.

WITH
  base AS
(
  -- your current query goes in here
),
  base_grouped AS
(
  -- First, create a group identifier, but in the -opposite- direction
  -- (This will group the rows where you want to sum [count2])
  SELECT
    *,
    SUM(count1) OVER (ORDER BY [date], [race_number], event_id)   AS group_id
  FROM
    base
),
  base_grouped_summed AS
(
  -- Then do the sum on [count2] within those groups
  SELECT
     *,
     SUM([count2]) OVER (PARTITION BY group_id)   AS sum_count2
  FROM
     base_grouped
)
-- Now deduct it from [lead2] (only does anything when [lead2] is not null)
SELECT
  *,
  lead2 - LAG(sum_count2) OVER (ORDER BY group_id)   AS new_value
FROM
  base_grouped_summed

Если вы знаете более эффективные способы определения того, какие строки SUM(), вы может быть в состоянии сократить это. Я просто использовал самые очевидные правила, основанные на ваших данных.

РЕДАКТИРОВАТЬ:

Чтобы продемонстрировать, что такое выражения общих таблиц, это то, что приведенный выше код будет выглядеть с вложенными подзапросами старой школы ...

-- Now deduct it from [lead2] (only does anything when [lead2] is not null)
SELECT
  *,
  lead2 - LAG(sum_count2) OVER (ORDER BY group_id)   AS new_value
FROM
(
  -- Then do the sum on [count2] within those groups
  SELECT
     *,
     SUM([count2]) OVER (PARTITION BY group_id)   AS sum_count2
  FROM
  (
    -- First, create a group identifier, but in the -opposite- direction
    -- (This will group the rows where you want to sum [count2])
    SELECT
      *,
      SUM(count1) OVER (ORDER BY [date], [race_number], event_id)   AS group_id
    FROM
    (
      -- your current query goes here
    )
      AS base
  )
    AS base_grouped
)
  AS base_grouped_summed

Большинство людей, привыкнув к CTE, находят их намного проще для чтения, изменения и отладки.

...