ReportTracking:
Userid, ReportId, Duration, CreatedDate
查询:
SELECT t.UserId, COUNT(DISTINCT(t.ReportId)) AS ReportsRead
FROM ReportTracking t
WHERE t.Duration >= 30
AND t.CreatedDate > DATEADD(Day, -30, GETDATE())
GROUP BY t.UserId
示例结果:
UserId ReportsRead
1 22
2 13
3 2
4 2
5 2
我需要做的是为Reports Read分配一个数字值。基本上是因为有3个用户阅读游泳并且他们在排名方面相关(他们每个人只有2个只读)我需要按最后阅读报告的顺序排序。我需要根据读数顺序为它们分配所有十进制数值。因此,最后阅读报告的人将获得.1,首先阅读该报告的人将获得.3。
我不太确定如何实现这一点,关键部分是它们确实有一个十进制数值来对它们进行排名,这个小数应该是几个小数点,因为记录很长。我的想法是使用DateCreated并将其转换为数值,我可以从最大值减去。但由于有多个日期(每个报告一个),我不知道如何获取最新日期,并且仅将该日期与我的报告计数一起使用。
答案 0 :(得分:2)
我不确定为什么需要指定小数...
按ReportsRead desc,max(createdDate)排序(这应该是select中用户最近阅读的内容。)
同样明显不是一个功能它是一个声明。不需要()
SELECT t.UserId
, COUNT(DISTINCT t.ReportId) AS ReportsRead
max(t.createDate) Asc) RN
FROM ReportTracking t
WHERE t.Duration >= 30
AND t.CreatedDate > DATEADD(Day, -30, GETDATE())
GROUP BY t.UserId
ORDER BY ReportsRead DESC, max(createdDate)
如果您需要数字并计划显示它们
WITH CTE AS (
SELECT t.UserId
, COUNT(DISTINCT t.ReportId) AS ReportsRead
, row_number() over (partition by count(Distinct t.reportID) order by max(t.createDate) Asc) RN
FROM ReportTracking t
WHERE t.Duration >= 30
AND t.CreatedDate > DATEADD(Day, -30, GETDATE())
GROUP BY t.UserId)
SELECT *
FROM CTE
ORDER BY ReportsRead DESC, RN
答案 1 :(得分:2)
您可以在ReportsRead分区中rank
您的行,通过在max(createddate)上排序来获取排名。 documentation: SQL Server Rank function
这是一个例子:http://sqlfiddle.com/#!18/1eefc/11
您可以通过使用CTE重用列别名来简化查询,但概念是:
SELECT t.UserId
, COUNT(DISTINCT( t.ReportId )) AS ReportsRead
, CAST(RANK()
OVER(
partition BY COUNT(DISTINCT( t.ReportId ))
ORDER BY MAX(t.createdDate) DESC) AS DECIMAL) / 10 ranking
FROM ReportTracking t
WHERE t.Duration >= 30
AND t.CreatedDate > DATEADD(Day, -30, GETDATE())
GROUP BY t.UserId
ORDER BY ReportsRead DESC
, ranking;