Как показать совокупный рост показателя по датам, используя sql и группировку по дате?

#mysql #sql #sql-server #amazon-redshift

#mysql #sql #sql-сервер #amazon-redshift

Вопрос:

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

У меня есть следующий набор данных:

данные = [{‘date’:’2016-01-01′,’value’:’1′},{‘date’:’2016-01-01′,’value’:’3′},{‘date’:’2016-01-02′,’value’:’3′},{‘date’:’2016-01-02′,’значение’:’2′}]

Следующий запрос создает приведенную ниже таблицу:

 select 
date, 
sum(value) over (order by date rows unbounded preceding) as value
from data
group by 
date, 
value
  

Ниже приведена моя таблица

 date        value       
2016-01-01  1   
2016-01-01  4
2016-01-02  7    
2016-01-02  9
  

Тем не менее, я хочу создать следующую таблицу:

 date        value       
2016-01-01  4   
2016-01-02  9
  

Когда я пытаюсь выполнить следующий запрос и не группирую по значению, я получаю приведенную ниже ошибку:

 select 
date, 
sum(value) over (order by date rows unbounded preceding) as value
from data
group by 
date
  

ОШИБКА:

столбец «значение» должен отображаться в предложении GROUP BY или использоваться в агрегатной функции

Комментарии:

1. mysql или sql-сервер?

2. Почему вы пометили это как MySQL, SQL Server И Redshift? Какой из них вы используете?

Ответ №1:

Может быть, суммировать значения по датам перед вычислением текущего итога?

 select date, 
    sum(value) over (order by date) as value
from (
    select date, sum(value) as value
    from data
    group by date
) t
  

Ответ №2:

Самое простое, что я мог придумать, это удалить строки, не связанные с предыдущими, и включить distinct .

 SELECT DISTINCT
    [date]
    ,SUM([value]) OVER (ORDER BY [date]) AS [value]
FROM @tbl
  

Тем не менее, вы также можете выполнить подзапрос с помощью row_number .

 SELECT
    [date]
    ,[value]
FROM (
    SELECT
        [date]
        ,SUM([value]) OVER (ORDER BY [date]) AS [value]
        ,ROW_NUMBER() OVER (PARTITION BY [date] ORDER BY [value] DESC) AS [row]
    FROM @tbl
    ) tbl
WHERE [row] = 1