【问题标题】:Determine persistent growth in value during a specific time range确定特定时间范围内价值的持续增长
【发布时间】:2021-07-02 07:05:11
【问题描述】:

鉴于以下数据集示例,我应该如何构造我的 SQL 查询以确定 value 是否在查询中的时间范围内逐渐逐日增长通过返回 true/false 结果来指定 user_id

user_id date value
1 4/1/2021 12:00 350
1 4/2/2021 12:00 400
1 4/3/2021 12:00 450
5 4/4/2021 12:00 560
5 4/5/2021 12:00 566
5 4/6/2021 12:00 483
5 4/7/2021 12:00 570

根据上面的例子,我们可以观察到user_id=1value逐日增长,而user_id=5value连续2天增长,但在第三天反弹。

因此,user_id=1user_id=5 的预期结果集将是:

user_id value_is_increasing
1 true

user_id=5 的预期结果集将是:

user_id value_is_increasing
5 false

声明更新:我想确定该值是否在特定时间范围内以逐日方式(连续)不断增长。此外,应将单个值点视为噪声(即使随着时间的推移呈上升或下降趋势,它们也会上下反弹)并影响结果。

【问题讨论】:

  • 这种事情很难正确指定。您能否edit您的问题更具体地说明您的连续增长标准?您想比较昨天的平均值和今天的平均值吗?您的个人value 点是否嘈杂:即使随着时间的推移呈上升或下降趋势,它们是否会上下反弹?
  • @O.Jones 我根据您的要求添加了声明更新
  • 它(连续)增长了多少?
  • @Strawberry 任意正百分比
  • ???那么它的“连续性”是什么?

标签: mysql sql analytics mysql-5.7 trend


【解决方案1】:

使用聚合:

SELECT user_id, 
       GROUP_CONCAT(value ORDER BY date) = GROUP_CONCAT(value ORDER BY value) value_is_increasing
FROM tablename
GROUP BY user_id
HAVING COUNT(*) > 1 
   AND COUNT(*) = COUNT(DISTINCT value)

条件COUNT(*) > 1 将仅返回表中值超过 1 个的用户。
条件COUNT(*) = COUNT(DISTINCT value) 将仅返回在表中只有不同值的用户。
GROUP_CONCAT(value ORDER BY date) 将返回按date 排序的值,
GROUP_CONCAT(value ORDER BY value) 将返回按value 排序的值。
如果 2 个GROUP_CONCAT() 的结果相同,则意味着values 是单调递增的。

请参阅demo

【讨论】:

  • 随着数据量的增长,随着时间的推移,以下表达式将具有可扩展性和高性能:GROUP_CONCAT(value ORDER BY date) = GROUP_CONCAT(value ORDER BY value) value_is_increasing ?
猜你喜欢
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2020-03-16
  • 1970-01-01
  • 2022-12-22
  • 1970-01-01
相关资源
最近更新 更多