【问题标题】:Calculation of median value for every day计算每天的中值
【发布时间】:2019-02-08 13:01:42
【问题描述】:

谁能帮我计算每个日期的中值?

activity
user_id login_time  bet
105 2018-04-01  20966119
102 2018-04-01  2027700
105 2018-04-01  5478000
104 2018-04-01  78448383
104 2018-04-06  49730093
101 2018-04-06  2750000
103 2018-04-15  16625000
105 2018-04-16  
106 2018-04-19  3095584

输出

login_time   median
2018-04-01   13222060
2018-04-06    26240047

我的查询

SELECT login_time, IF(SUM((IFNULL(bet, 0)) / 2) % 2 = 0, SUM(IFNULL(bet, 0)) 
    / 2 + 1, SUM(IFNULL(bet, 0)) / 2) 
 AS median
FROM activity
WHERE login_time BETWEEN '2018-04-01' AND '2018-04-06'
GROUP BY login_time;

怎么了? 谢谢!

【问题讨论】:

  • 你的预期输出是什么
  • @fa06 ,我更新了
  • 您确定要中位数吗?你能解释一下你目前尝试的逻辑吗?
  • @Gordon Linoff,是的,我需要中值。可能是我的查询是错误的。但是需要帮助
  • @Raymond Nijland,我在 Excel 中得到了这个结果。我应该改变什么以获得正确的结果?

标签: mysql sql database join select


【解决方案1】:

如果您的数据不是太大,则有一个group_concat() 技巧。这很好用:

select a.login_time,
       substring_index(substring_index(group_concat(bet order by bet), ',', ceil(count(*) / 2), ',', -1)
from activity a
where a.login_time between '2018-04-05' and '2018-04-18'
group by a.login_time;

如果有偶数个示例,则选择较低的值。对于偶数基数的集合,中位数没有很好的定义。

【讨论】:

  • 谢谢,但是:错误 1582 (42000):调用本机函数 'substring_index' 时的参数计数不正确
  • 这不处理完全中位数。当项目计数为偶数时,正确的中位数计算将使用两个有序中间行的 AVG。当项目计数时,中位数将从订单列表中选择中间项目很奇怪。这个查询只处理偶数
猜你喜欢
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 2014-08-05
  • 1970-01-01
  • 2018-06-28
  • 2023-03-12
相关资源
最近更新 更多