Последовательная сумма

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

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

Вы должны объяснить свой заказ логикой. Это по столбцу IND? Или комбинация DATE и IND?

Isolated 07.08.2023 19:38

Пожалуйста, прочтите это несколько советов по улучшению вашего вопроса.

HABO 07.08.2023 21:51

Спасибо за все советы. Ценится. Заполните сделать это в будущем.

Inimitableguy 08.08.2023 10:34
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
4
4
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете попробовать так: (включите все столбцы с точки зрения того, на каком уровне вы хотели бы получить данные

WITH c1 AS (
  SELECT 
    IND, 
    Linekey, 
    productioncountWOtearoff,
    SUM(CASE WHEN productioncountWOtearoff IS NOT NULL THEN 1 ELSE 0 END) OVER (PARTITION BY Linekey ORDER BY IND) AS group_id
  FROM table
)

SELECT 
  IND, 
  Linekey, 
  productioncountWOtearoff,
  CASE WHEN productioncountWOtearoff IS NOT NULL THEN SUM(productioncountWOtearoff) OVER (PARTITION BY Linekey, group_id ORDER BY IND) END AS Sum
FROM c1
ORDER BY IND;

Вы можете использовать пару оконных функций, чтобы получить такой результат. Например:

select x.*,
  case when row_number() over(partition by g order ind desc) = 1 
        and pcwoto is not null
       then sum(pcwoto) over(partition by g order by ind)
  end as sm
from (
  select t.*, sum(case when pcwoto is null then 1 else 0 end) as g
  from t
) x
Ответ принят как подходящий

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

Select IND, LineKey, Machinery, StartTime, EndTime, Date, ProductionCountWOTearoff,
  Sum(ProductionCountWOTearoff) Over (Partition By grouping
      Rows Between Unbounded Preceding And Unbounded Following) as Total
From (
    Select mytable.*, sum(Case When ProductionCountWOTearoff is null Then 1 Else 0 End)
         Over (Order By IND Rows Between Unbounded Preceding And Current Row) as grouping
    From mytable
)
Order By IND

Мой точно такой же, как ответ @The Impaler. Мой немного более подробный, так как включает диапазон окон (между строками), который я делаю с SUM(), потому что поведение различается в разных СУБД.

Chris Maurer 07.08.2023 20:09

Привет, Крис. Ваш код работает, я внес в него несколько изменений. Например, упорядочить его по ключу линии, ключу машины, IND. Дело в том, что я просто был суммой в последней строке перед нулем. Не во всех рядах.

Inimitableguy 08.08.2023 15:41

Заключите Sum() во вторую строку внутри Case When grouping<>lead(grouping) Over (Order By IND) Then ... End Это поместит сумму только в последнюю строку каждой группы.

Chris Maurer 08.08.2023 15:52

Спасибо, теперь все работает правильно.

Inimitableguy 08.08.2023 16:11

Другие вопросы по теме