【问题标题】:Concatenate values from columns without grouping rows SQL连接列中的值而不对行进行分组 SQL
【发布时间】: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

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

  1. 有没有办法在同一个 sql 查询中平均出字符串中的值?

  2. 这是一种完全没有必要的方法来消除低于所有值的第 25 个百分位和高于第 75 个百分位的值吗?有没有办法做得更好?我想一定有一种方法可以设置一个 HAVING 子句来计算百分位数并删除低于或高于它们的值,对吧?类似于: HAVING value >= 25thPercentileOfValues AND value

任何帮助将不胜感激,谢谢你们:D

【问题讨论】:

  • 你的代码看起来像 MySQL,所以我添加了标签。

标签: mysql sql average percentile


【解决方案1】:

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

select clientid, avg(value)
from (select t.*, ntile(4) over (partition by clientid order by value) as tile
      from t
     ) t
where tile in (2, 3)
group by clientid;

【讨论】:

  • 您好,感谢您的回复:D 我不断收到 SQL 错误:[42000][1064] 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在“(PARTITION BY clientId ORDER BY value)附近使用的正确语法作为平铺”知道为什么吗?
  • @fais 。 . . ntile() 自 MySQL 8.0 发布以来可用。
猜你喜欢
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 2020-11-22
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多