簡體   English   中英

連接列中的值而不對行進行分組 SQL

[英]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

在這一點上,我得到了沒有我不想要的值的連接字符串。 我的下一步是平均剩余的值,但此時我不能這樣做,因為這些值現在都在一個字符串中。

  1. 有沒有辦法在同一個 sql 查詢中平均出字符串中的值?

  2. 這是一種完全沒有必要的方法來消除低於所有值的第 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM