簡體   English   中英

如何計算十分位數的頻率

[英]How to calculate frequencies over deciles

一切都記錄在收銀機數據庫表[dbo].[festival] [dbo].[festival]中的每一行都是來自節日參與者的訂單行。 我們有以下列:

[ticket_no] int - 每個參與者都有一個唯一的入場券編號,盡管這不是 PK,因為許多參與者在他們蹣跚回家或被執行之前訂購了很多輪。

[price] float - 供應的各種類型和大小的啤酒的價格標簽。

[quantity] int - 以該價格訂購的啤酒數量。

現在我想更好地了解參與者。 我想將啤酒的總銷售額分成 10 個相等的塊,每個十分位數的參與者人數和十分位數的絕對消費范圍,按升序排列。 就像是:

[Decile] / [Lower end of range] / [Upper end of range] / [No of participants] / [Total sales in this decile]

因此,假設總銷售額為 100.000,前兩行(共十行)可能類似於:

1 / 2.50 / 4.75 / 3104 / 10.000 

2 / 4.75 / 6.50 / 1905 / 10.000
...

這意味着 3104 名最低消費范圍從 2.50 到 4.75 的參與者代表了 100k 啤酒銷售的前 10k,然后有 1905 名參與者在...等之間進行了消費。

你如何在 SQL 中解決這個問題? 我未能將 John Cappelletti 的解決方案應用於之前的問題。

好的,所以我設法找到了一個人,他不僅習慣於將現實生活中的問題轉化為代碼(常見的工作要求),而且還對幫助和解決問題比農業代表和刪除帖子更感興趣。

這是他對我的問題的解決方案,對我的目的來說效果很好。 既然沒有人真正解決了這個問題,誰知道呢,也許你會從中吸取教訓? 只是想提供幫助。

;WITH cte AS (
    SELECT SUM(price * quantity) spending, ticket_no
    FROM festival
    GROUP BY ticket_no
    )
SELECT MIN(spending) min_spending, MAX(spending) max_spending, SUM(participant) tot_participants, SUM(participant * spending) tot_spending
FROM (
    SELECT
        MAX(spending) spending
        ,COUNT(*) participant
        ,SUM(spending * COUNT(*)) OVER (ORDER BY spending) AS cumulative
        ,((SUM(spending * COUNT(*)) OVER (ORDER BY spending) / SUM(spending * COUNT(*)) OVER () * 100 / 10) AS cumulative_percent
    FROM cte
    GROUP BY spending
    ) a
GROUP BY CAST(cumulative_percent - 0.000001 AS int) --To avoid an 11th decile in my sample

請注意,十分位數的大小不會完全相同(他懷疑是否有解決方法),但對於我的目的來說已經足夠接近了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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