2016-07-25 62 views
2

我有一張表,其中包含用戶的互聯網歷史記錄。該表格的結構包含該頁面的User_IDPage AcceptedDate Accepted。例如:通過頁面列表選擇最熱門用戶

+==========================================+ 
|User_ID | Page_Accessed | Date_Accessed | 
+==========================================+ 
|Johh.Doe | Google  | 1/1/2015 | 
|Johh.Doe | Google  | 1/1/2015 | 
|Suzy.Lue | Google  | 7/11/2015 | 
|Suzy.Lue | Wikipedia  | 4/23/2015 | 
|Babe Ruth| StackOverflow | 9/1/2015 | 
+==========================================+ 

我目前正在使用一個使用SQL查詢:

RANK() OVER (PARTITION BY [Page Accessed] ORDER BY Count(DateAcc))

然後,我通過各個站點使用PIVOT()。從PIVOT()和GROUP BY [等級]選擇記錄WHERE (Num = 1)後不過,我結束了,導致類似的查詢:

+=================================================+ 
|Rank  | Google | Wikipedia | StackOverflow | 
+=================================================+ 
| 1  | John Doe| NULL |  NULL  | 
| 1  | NULL | Suzy Lue |  NULL  | 
| 1  | NULL | NULL |  Babe Ruth | 
+=================================================+ 

相反,我需要重新格式化我的輸出:

+=================================================+ 
|Rank  | Google | Wikipedia | StackOverflow | 
+=================================================+ 
| 1  | John Doe| Suzy Lue | Babe Ruth | 
+=================================================+ 

我當前的查詢:

SELECT Rank, Google, Wikipedia, StackOverflow 
    FROM(
     SELECT TOP (100) PERCENT User_ID, Page_Accessed, COUNT(Date_Accessed) AS Views, 
     RANK() OVER (PARTITION BY Page_Accessed ORDER BY Count(Date_Accessed) DESC) AS Rank 

     FROM Record_Table 
     GROUP BY dbo.location_key.subSite, dbo.user_info_list_parse.Name 
    ORDER BY Views DESC) AS tb 

    PIVOT (
    max(tb.User_ID) FOR 
    Page_Accessed IN (Google, Wikipedia, StackOverflow) 
    ) pvt 

WHERE (Num = 1) 

是否有任何創造性的解決方案來獲得這樣的結果?

+2

提供您的完整查詢。 – Nicarus

+1

不那麼有創意,但是....只需在每個字段中添加一個max(),除了rank和group by等級。 '...最大(谷歌)作爲谷歌,最大(維基百科)作爲維基百科,最大(Stackoverflow)作爲StackOverflow ....分組排名# – xQbert

+1

我不明白你爲什麼使用'Date_Accessed'作爲聚合字段參數爲'PIVOT' - 這就是爲什麼你的穀物「關閉」 – Nicarus

回答

1

我認爲你已經找到了解決方案,但是對於你的信息和其他讀者來說 - 讓我在這個查詢中消除噪音。無需使用ORDER BY,無需應用TOP(100)PERCENT,Views列是多餘的。我會簡化這個查詢如下:

CREATE TABLE InternetHistory 
(
    [User_ID] varchar(20), 
    [Page_Accessed] varchar(20), 
    [Date_Accessed] datetime 
) 
INSERT InternetHistory VALUES 
('Johh.Doe', 'Google', '2015-01-01'), 
('Johh.Doe', 'Google', '2015-01-01'), 
('Suzy.Lue', 'Google', '2015-07-11'), 
('Suzy.Lue', 'Wikipedia', '2015-04-23'), 
('Babe Ruth', 'StackOverflow', '2015-01-09') 

SELECT * FROM 
(
    SELECT [User_ID], [Page_Accessed], RANK() OVER (PARTITION BY [Page_Accessed] ORDER BY COUNT(*) DESC) Ranking 
    FROM InternetHistory 
    GROUP BY [User_ID], [Page_Accessed] 
) AS Src 
PIVOT 
(
    MAX([User_Id]) FOR [Page_Accessed] IN ([Google], [Wikipedia], [StackOverflow]) 
) AS Pvt 
WHERE Ranking = 1 
+0

非常簡潔。感謝您的意見! – JBK