按发生率最高的值排序

Hik*_*ari 2 sql-server t-sql sql-server-2012

我有一个表作为这个例子:

CREATE TABLE customerEvent(
    customerID  int NOT NULL,
    eventID     int NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

customerID 可能出现在许多记录中。我使用以下查询来识别最常用的 customerID:

SELECT
    customerID,eventID
    ,row_number() OVER(PARTITION BY customerID ORDER BY eventID) as frequency
FROM customerEvent
ORDER BY frequency DESC
Run Code Online (Sandbox Code Playgroud)

有了这个我看到了那些最频繁的customerID。但它们仅在列表顶部出现一次。例子:

customerID  eventID frequency
7           3       5
15          9       4
7           1       4
9           4       3
7           10      3
15          2       3
Run Code Online (Sandbox Code Playgroud)

我需要最频繁的 customerID 的所有记录出现在顶部,例如:

customerID  eventID frequency
7           3       5
7           1       4
7           10      3
15          9       4
15          2       3
9           4       3
Run Code Online (Sandbox Code Playgroud)

知道如何构建一个查询吗?

ype*_*eᵀᴹ 7

看来你真的不需要排序的“频率”,只需要每个客户的“最大频率”。您可以使用COUNT(*) OVER (PARTITION BY customerID)

SELECT
    customerID, 
    eventID,
    ROW_NUMBER() OVER (PARTITION BY customerID ORDER BY eventID) AS frequency  
FROM 
    customerEvent
ORDER BY 
    COUNT(*) OVER (PARTITION BY customerID) DESC,
    customerID,
    frequency DESC ; 
Run Code Online (Sandbox Code Playgroud)

第二部分order by需要是customerID为了以防万一。我假设如果您有两个或更多客户的事件数量相同,您不希望他们的事件混淆。