【发布时间】:2020-08-19 05:07:32
【问题描述】:
这是我的桌子:
clientId | value | date |
1 | 2| Jan 1|
1 | 3| Jan 2|
1 | 4| Jan 5|
2 | 1| Jan 1|
2 | 2| Jan 2|
2 | 7| Jan 6|
我想删除值低于每个客户端所有值的第 25 个百分位且高于第 75 个百分位的行。然后我想平均剩余的值。我的想法是以升序将值行连接在一起,然后使用 SUBSTRING_INDEX 删除高于或低于阈值的值,使用 COUNT(*) 计算:
SUBSTRING_INDEX(SUBSTRING_INDEX(
GROUP_CONCAT(`transactionCount` ORDER BY
`transactionCount` SEPARATOR ','), ',', -(75 / 100 * COUNT(*))),
',', ROUND(75 / 100 * COUNT(*) -1)) AS sub2
此时,我得到了没有我不想要的值的连接字符串。我的下一步是平均剩余的值,但此时我不能这样做,因为这些值现在都在一个字符串中。
有没有办法在同一个 sql 查询中平均出字符串中的值?
这是一种完全没有必要的方法来消除低于所有值的第 25 个百分位和高于第 75 个百分位的值吗?有没有办法做得更好?我想一定有一种方法可以设置一个 HAVING 子句来计算百分位数并删除低于或高于它们的值,对吧?类似于: HAVING value >= 25thPercentileOfValues AND value
任何帮助将不胜感激,谢谢你们:D
【问题讨论】:
-
你的代码看起来像 MySQL,所以我添加了标签。
标签: mysql sql average percentile