【问题标题】:SQL select issue : get max value for each daySQL 选择问题:获取每天的最大值
【发布时间】:2019-02-08 14:19:24
【问题描述】:

我的 SQL 选择有问题,我需要在 DateDebutDateFin 之间的每一天获取列 (currentcount) 的最大值,但返回的结果显示了多个值.

我的 SQL 语句:

DECLARE @dateDebut DATE, 
        @dateFin DATE, 
        @SITA_METIER VARCHAR(20), 
        @DEFSITE VARCHAR(20);

SET @dateDebut = '01/01/2017';
SET @dateFin = '31/12/2018';


SELECT DISTINCT
    CONVERT(DATE, attemptdate) AS Date, 
    MAX(currentcount) AS MAXUSERS
FROM
    logintracking 
WHERE
    attemptdate BETWEEN CONVERT(DATE, @dateDebut) AND CONVERT(DATE, @dateFin)
    AND logintracking.clientaddr IN ('10.118.254.21', '10.118.254.156') 
GROUP BY
    attemptdate, currentcount

结果:

enter image description here

期望的结果:每天只有列 (currentcount) 的最大值

PS:attemptdate 类型是Timestamp,这就是为什么我需要将其转换为简单的日期。

我也尝试使用“有”功能,但仍然得到多个值

【问题讨论】:

  • 您通常按您选择的列进行分组,除了那些作为设置函数的参数的列。 IE。试试group by CONVERT(Date,attemptdate)
  • 我试过了,结果还是一样
  • 添加示例表数据和预期结果 - 作为格式化文本,而不是图像。
  • 如果你使用 jarlh 的 GROUP BY 子句,你不能得到重复的天数。 GROUP BY 子句中可能还有 currentcount

标签: sql sql-server sql-server-2008 select where-clause


【解决方案1】:

你已经使用GROUP BYdistinct没有意义,所以distinct可以去掉。

那么你只需修改CONVERT(Date,attemptdate)而不是Group by中的attemptdate,只需要group by CONVERT(Date,attemptdate)

select CONVERT(Date,attemptdate) as Date, max(currentcount) as MAXUSERS
from logintracking 
where attemptdate between @dateDebut and @dateFin
  and logintracking.clientaddr in ('10.118.254.21', '10.118.254.156') 
group by CONVERT(Date,attemptdate)

注意:

您的@dateDebut@dateFin 已经是Date 类型。无需使用CONVERT函数。

【讨论】:

  • @Anass 很高兴帮助你标记这个答案,如果对你有帮助的话:)
  • @Anass:你明白为什么吗? GROUP BY xyz 表示每个 xyz 一个结果行。如果您希望每天有一个结果行,则需要GROUP BY day 而不是GROUP BY day, something_else
猜你喜欢
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 2022-11-13
  • 2020-05-16
  • 1970-01-01
  • 2021-04-17
  • 2018-03-06
  • 2021-02-23
相关资源
最近更新 更多