【问题标题】:Getting aggregated values获取聚合值
【发布时间】:2016-11-21 03:25:59
【问题描述】:

我有下表 -

UserId    Some_Value1   Datetime
1            0            24-11-2016 13:00
1            0            24-11-2016 13:45
1            1            24-11-2016 15:00
1            1            24-11-2016 17:15
2            0            25-11-2016 11:23
2            1            25-11-2016 13:22
2            0            25-11-2016 14:01
2            1            25-11-2016 18:00

如您所见 - 当上一行的日期时间值大于 1 Hour 相同的 userId 时,Some_Value1 中的值是 1

datetime 字段大于1 Hour 时,我正在尝试获取序列号而不是10

类似于下面的结果 -

UserId    Some_Value1             Datetime            Some_Value2
    1            0            24-11-2016 13:00            1
    1            0            24-11-2016 13:45            1
    1            1            24-11-2016 15:00            2
    1            1            24-11-2016 17:15            3
    2            0            25-11-2016 11:23            1
    2            1            25-11-2016 13:22            2
    2            0            25-11-2016 14:01            2
    2            1            25-11-2016 18:00            3

我正在尝试使用postgresRedshift 来实现这一目标。标记OracleMysql 以覆盖更多受众并获得SQL 的伪代码查询对于所有数据库来说几乎都是相同的,除了内置函数。

以上所有数据仅供参考。这只是样本数据,真实场景会有更多随机数据。因此代码需要是动态的而不是硬编码的。

【问题讨论】:

  • 你的假设是错误的。删除了错误的数据库标签。

标签: sql postgresql amazon-redshift


【解决方案1】:
sum (Some_Value1) over 
(
    partition by UserId 
    order by     Datetime 
    rows         unbounded preceding
) + 1                                 as Some_Value2

【讨论】:

    【解决方案2】:
    CREATE TABLE #Table (UserId INT,Some_Value1 INT,_Datetime VARCHAR(20),_Sum INT)
    
    INSERT INTO #Table (UserId ,Some_Value1 ,_Datetime )
    SELECT 1,0,'24-11-2016 13:00' UNION ALL
    SELECT 1,0,'24-11-2016 13:45' UNION ALL
    SELECT 1,1,'24-11-2016 15:00' UNION ALL
    SELECT 1,1,'24-11-2016 17:15' UNION ALL
    SELECT 2,0,'25-11-2016 11:23' UNION ALL
    SELECT 2,1,'25-11-2016 13:22' UNION ALL
    SELECT 2,0,'25-11-2016 14:01' UNION ALL
    SELECT 2,1,'25-11-2016 18:00'
    
    SELECT UserId ,Some_Value1,_Datetime,sum (Some_Value1) OVER(PARTITION BY UserId ORDER BY _Datetime) + 1 as Some_Value2
    FROM #Table
    

    【讨论】:

    • 虽然基本思想是正确的,但您不应该使用不适合任何标记数据库(Postgres 或 Redshift)的语法来回答。
    猜你喜欢
    • 1970-01-01
    • 2021-03-21
    • 2018-09-22
    • 2019-01-15
    • 2023-03-21
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多