如何使用 sql 和按日期分组显示指标在日期上的累积增长?

Posted

技术标签:

【中文标题】如何使用 sql 和按日期分组显示指标在日期上的累积增长?【英文标题】:How to show cumulative growth in a metric over dates using sql and grouping by date? 【发布时间】:2016-10-11 19:31:33 【问题描述】:

我想显示一个指标在某个日期内的累积增长,同时还对日期进行分组,以便该日期在表格中只出现一次

我有以下数据集:

数据 = ['date':'2016-01-01','value':'1','date':'2016-01-01','value':'3','date': '2016-01-02','value':'3','date':'2016-01-02','value':'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 子句中或用于 聚合函数

【问题讨论】:

mysql 还是 sql-server? 您为什么将其标记为 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

【讨论】:

以上是关于如何使用 sql 和按日期分组显示指标在日期上的累积增长?的主要内容,如果未能解决你的问题,请参考以下文章

分组依据、IFNULL 和按日期排序

猫鼬日期比较没有时间和按多个属性分组?

具有分组和按日期排序的复杂 sum()

猫鼬日期比较没有时间和按createdAt和staffId分组,每周、每月和每年按聚合计算的员工总数?

Oracle里面如何让一段日期按周、月、季度、年分组显示啊?求高手赐教,贴出正确sql追加高分!

sql 显示如何拉出列表,在特定日期之间拉出某些上诉和贡献,以及(customer 4)按customer_no和HAVING S分组