Я пытаюсь создать новый столбец с именем sum, который вычисляет сумму productioncountwotearoff до тех пор, пока не появятся нулевые значения, а затем снова перезапустит сумму. введите здесь описание изображения
Я также пытаюсь создать новую таблицу с ключом линии, ключом машины, временем начала, временем окончания, датой и соответствующей суммой. Любая помощь будет оценена по достоинству.
Вы должны объяснить свой заказ логикой. Это по столбцу IND? Или комбинация DATE и IND?
Пожалуйста, прочтите это несколько советов по улучшению вашего вопроса.
Спасибо за все советы. Ценится. Заполните сделать это в будущем.


Вы можете попробовать так: (включите все столбцы с точки зрения того, на каком уровне вы хотели бы получить данные
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(), потому что поведение различается в разных СУБД.
Привет, Крис. Ваш код работает, я внес в него несколько изменений. Например, упорядочить его по ключу линии, ключу машины, IND. Дело в том, что я просто был суммой в последней строке перед нулем. Не во всех рядах.
Заключите Sum() во вторую строку внутри Case When grouping<>lead(grouping) Over (Order By IND) Then ... End Это поместит сумму только в последнюю строку каждой группы.
Спасибо, теперь все работает правильно.