【问题标题】:SQL Server : return only max from count per daySQL Server:仅从每天的计数中返回最大值
【发布时间】:2022-01-05 01:34:06
【问题描述】:

以下查询返回:多个日期(每个用户每天的计数)、IP 计数、用户名。

我需要它每天只返回用户的最大值(只返回最高的一个)。

如果我从 group by 中删除用户名,它就可以正常工作。问题是我还需要表格结果中的用户名。

我尝试使用没有锁的子查询。

任何帮助将不胜感激。

SELECT DISTINCT 
    FORMAT([UTCTimestamp], 'yyyy-MM-dd') AS 'DATE',
    T.Username,
    COUNT(clientIP) AS "CountClientIP" 
FROM
    dbo.tablename O
LEFT JOIN
    [DBNAME2]..vwAD_tablename T ON T.UserID = O.userID
LEFT JOIN
    [DBNAME1]..Event E ON E.Code = O.Code  
WHERE 
    FORMAT([UTCTimestamp], 'yyyy-MM-dd') LIKE '2018-01-%' 
    AND T.Username IS NOT NULL
GROUP BY   
    T.Username, FORMAT([UTCTimestamp], 'yyyy-MM-dd')
ORDER BY 
    FORMAT([UTCTimestamp], 'yyyy-MM-dd'), COUNT(clientIP) DESC

【问题讨论】:

  • 您好,欢迎来到 SO。如果您包含一些示例数据和预期结果,则此类问题会得到更好更快的回答。请将它们添加到您的问题中,但不是作为图像,而是作为文本,我们可以复制/粘贴。
  • 旁白:CAST(... AS date) 更适合从datetime 截断时间分量。你的left joins 没有意义,因为你上面有where,也许这些条件应该在on 或者它应该是inner join

标签: sql sql-server select


【解决方案1】:

添加一个 ROW_NUMBER,将其包装在子查询中,然后对其进行过滤。

SELECT [DATE], Username, CountClientIP
FROM
(
    SELECT  
        FORMAT([UTCTimestamp],'yyyy-MM-dd') AS [DATE],
        T.Username,
        COUNT(DISTINCT clientIP) AS [CountClientIP], 
        ROW_NUMBER() OVER (PARTITION BY FORMAT([UTCTimestamp],'yyyy-MM-dd')
                           ORDER BY COUNT(DISTINCT clientIP) DESC) AS rn
    FROM [DBNAME].dbo.tablename O
    LEFT JOIN [DBNAME2]..[vwAD_tablename] T ON T.UserID = O.userID
    LEFT JOIN [DBNAME1]..[Event] E ON E.Code = O.Code  
    WHERE FORMAT([UTCTimestamp],'yyyy-MM-dd') LIKE '2018-01-%' 
      AND T.Username IS NOT NULL
    GROUP BY T.Username, FORMAT([UTCTimestamp],'yyyy-MM-dd')
) q
WHERE rn = 1
ORDER BY [DATE]

【讨论】:

  • 解决了我的问题!感激不尽:)
  • 谢谢。顺便说一句,这种方法之所以有效,是因为 window functions 是在聚合之后处理的。
  • 附带说明,如果您想报告多个拥有前 1 个 CountClientIP 的用户,请使用 DENSE_RANK 而不是 ROW_NUMBER
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多