Sql 在页面列表上选择“顶级用户”

Sql 在页面列表上选择“顶级用户”,sql,sql-server,Sql,Sql Server,我有一个包含用户互联网历史记录的表格。该表的结构包含该页面的用户ID、访问的页面、访问的日期。例如: +==========================================+ |User_ID | Page_Accessed | Date_Accessed | +==========================================+ |Johh.Doe | Google | 1/1/2015 | |Johh.Doe | Google

我有一个包含用户互联网历史记录的表格。该表的结构包含该页面的用户ID、访问的页面、访问的日期。例如:

+==========================================+ 
|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()超过(按[Page Accessed]分区按计数排序(DateAcc))

然后我在不同的站点上使用PIVOT()。然而,在从PIVOT()和一个GROUP BY[Rank]中选择记录
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)

有什么创造性的解决方案可以获得这个结果吗?

我想你们已经找到了解决方案,但为了你们的信息和其他阅读本文的人,让我来消除这个查询中的噪音。不需要按顺序排序,不需要应用顶部(100%),视图列是多余的。我将把这个问题简化如下:

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

提供完整的查询。不是很有创意,但是。。。。只需将max()添加到除rank和group by rank之外的每个字段<代码>…max(谷歌)为谷歌,max(维基百科)为维基百科,max(Stackoverflow)为Stackoverflow。。。。按等级分组我不明白为什么要使用
Date\u Accessed
作为
PIVOT
的聚合字段参数-这就是为什么你的grain“off”Good Catch@Nicarus!我一定是在之前乱搞我的代码时换了这些。我现在有了用户ID作为PIVOT的聚合。非常简洁。谢谢你的意见!