从列中合并值而不对行进行分组SQL

问题描述 投票:0回答:1

这是我的桌子:

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

此时,我得到的连接字符串没有我不需要的值。我的下一步是对剩余的值求平均值,但是我现在不能这样做,因为这些值现在都在字符串中了。

  1. 是否有一种方法可以对同一sql查询中的字符串中的值求平均?

  2. 这是摆脱所有值的第25个百分点以下和第75个百分点以上的值的完全不必要的方法吗?有没有办法做得更好?我想必须有一种方法可以设置一个HAVING子句,该子句可以计算百分位数并删除低于或高于百分位数的值,对吗?类似于:具有值> = 25thPercentileOfValues和值<= 75thPercentileOfValues。但是我该如何测量这两个值:(

任何帮助将不胜感激,谢谢大家:D

mysql sql average percentile
1个回答
0
投票

可能最简单的方法是ntile(),先过滤,然后聚合:

ntile()
© www.soinside.com 2019 - 2024. All rights reserved.