按小数顺序排列相同值的计数

时间:2018-02-21 16:41:54

标签: sql sql-server

编辑:我已编辑此问题以简化查询:

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并将其转换为数值,我可以从最大值减去。但由于有多个日期(每个报告一个),我不知道如何获取最新日期,并且仅将该日期与我的报告计数一起使用。

2 个答案:

答案 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;