[英]Concatenate values from columns without grouping rows SQL
這是我的表:
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 <= 75thPercentileOfValues。 但是我將如何測量這兩個值:(
任何幫助將不勝感激,謝謝你們:D
可能最簡單的方法是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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.