【问题标题】:Sum value with date condition日期条件的总和值
【发布时间】:2018-04-25 15:07:28
【问题描述】:

我的表中有以下值:

daytime  |user|value
22Apr2018|A   |1000
04May2018|A   |100
05May2018|A   |200
05May2018|B   |700
09May2018|C   |1000
10May2018|C   |800
15May2018|A   |1000
16May2018|A   |250
17May2018|A   |250

如果两者之间只有一天的差距,我如何按用户和日期对值求和?

预期结果将是:

daytime  |user|value
22Apr2018|A   |1000
04May2018|A   |300
05May2018|B   |700
09May2018|C   |1800
15May2018|A   |1500

【问题讨论】:

  • 谢谢@utsav,不知道它显示得很糟糕,想编辑它,你的速度更快:p
  • @RyanWilson OP 要求总结“如果两者之间只有一天的差距” - 截断到月初不会解决这个问题。
  • @Utsav 如果有连续值,我需要将值分组到第一个日期,例如。对于 04May2018|A |100 和 05May2018|A |200,我需要将其分组到 04May2018 下,值为 300
  • 在 Oracle 中搜索 gaps and islands 实现。
  • 你在白天做 GROUP BY 吗?

标签: sql oracle group-by gaps-and-islands


【解决方案1】:

你可以使用:

WITH cte AS (
  SELECT t.*,
    ROW_NUMBER() OVER(ORDER BY daytime) - 
    ROW_NUMBER() OVER(PARTITION BY "user" ORDER BY daytime) grp
  FROM tab t
)
SELECT MIN(daytime) AS daytime, "user", SUM(value) AS value
FROM cte
GROUP BY "user", grp
ORDER BY daytime;

DBFiddle Demo

编辑:

如果同一用户存在不同的日期间隔,则该解决方案似乎不起作用

WITH cte AS (
  SELECT t.*,
   ROW_NUMBER() OVER(ORDER BY daytime) 
   - ROW_NUMBER() OVER(PARTITION BY "user" ORDER BY daytime) grp
  FROM tab t
), cte2 AS (
  SELECT c.*, 
    CASE WHEN daytime - 1 = 
     COALESCE(LAG(daytime) OVER(PARTITION BY "user", grp ORDER BY daytime),
     daytime-1) THEN 0 ELSE 1 END AS grp2
  FROM cte c
), cte3 AS (
  SELECT c2.*, SUM(grp2) OVER(PARTITION BY "user", grp ORDER BY daytime) AS s
  FROM cte2 c2
)
SELECT MIN(daytime) AS daytime, "user", SUM(value) AS value
FROM cte3
GROUP BY "user", grp, s
ORDER BY "user", grp, daytime;

DBFiddle Demo2

【讨论】:

  • 谢谢@lad2025!如果我想让它更简单,只有一个用户,应该怎么做?
  • 嗨@lad2025,如果与同一用户有不同的日期间隔,该解决方案似乎不起作用,例如:04May2018|A |100 05May2018|A |200, 08May2018|A |200 09May2018| A |300, 10May2018|A |100 11May2018|A |700.. 查询将给出一行结果,将所有日期相加,而不是 04May2018 = 300、08May2018 = 500 和 10May2018 = 800 的 3 行结果
  • @akira 好的,已修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
相关资源
最近更新 更多