Sql 在页面列表上选择“顶级用户”
我有一个包含用户互联网历史记录的表格。该表的结构包含该页面的用户ID、访问的页面、访问的日期。例如:Sql 在页面列表上选择“顶级用户”,sql,sql-server,Sql,Sql Server,我有一个包含用户互联网历史记录的表格。该表的结构包含该页面的用户ID、访问的页面、访问的日期。例如: +==========================================+ |User_ID | Page_Accessed | Date_Accessed | +==========================================+ |Johh.Doe | Google | 1/1/2015 | |Johh.Doe | Google
+==========================================+
|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的聚合。非常简洁。谢谢你的意见!