2015-09-10 22 views
0

我有一個包含多個客戶和多個交易日期的表格。根據點數計算的多個頭號1

Cust_ID Trans_Date 
------- ---------- 
C01 2012-02-18 
C01 2012-02-27 
C01 2012-03-09 
C02 2012-02-15 
C02 2012-03-09 
C03 2012-03-30 
C01 2013-01-14 
C02 2013-02-21 
C03 2013-01-15 
C03 2013-03-07 

我想找到每年大部分交易和該客戶交易的客戶。 以下是我期待的結果。

​​

任何人都可以幫助腳本? SQL SVR的版本將於2012年

請多關照, 托馬斯

回答

1

這是 「每組最大的N」 的問題。通常通過row_number()解決。

;WITH CTE AS (
    SELECT YEAR(Trans_Date) Year, 
     Cust_ID, 
     COUNT(*) as nTrans, 
     ROW_NUMBER() OVER (PARTITION BY YEAR(Trans_Date) ORDER BY COUNT(*) DESC) rn 
    FROM Table 
    GROUP BY YEAR(Trans_Date), 
     Cust_ID 
) 
SELECT Year, 
    Cust_ID, 
    nTrans 
FROM CTE 
WHERE rn = 1 
ORDER BY Trans_Year 

嚴格地說,這裏的ROW_NUMBER()不確定性的方法有序。正如所寫的,如果計數中有一個綁定,查詢只返回一個Cust_ID,但不能保證將返回哪個ID。它應該是ORDER BY COUNT(*) DESC, Cust_ID以使結果一致,或者您應該使用RANK()DENSE_RANK()來允許關係。

+0

這工作完美。非常感謝。 – THOMAS

+0

@THOMAS可能要檢查我的更新。所寫的查詢不處理關係。如果這是一個問題,您可能需要使用'RANK()'而不是'ROW_NUMBER()'來查看。 –

+0

感謝培根,值得注意。 – THOMAS

0

我還沒有測試它的機會,但你的解決方案應該是這個樣子:

SELECT YEAR(Trans_Date) AS Year, Cust_ID, COUNT(*) AS nTrans 
FROM Transactions 
GROUP BY Year, Cust_ID 
HAVING MAX(nTrans); 

看一看SQL中的Group by functions

0

您可以使用列上的max()函數來查找列中的最大值。在這種情況下,你可以申請max(nTrans)

如:

SELECT MAX(column_name) FROM table_name;