【问题标题】:SELECT COUNT of MAX from GROUP BY with multiple HAVING clauses (I think)SELECT COUNT of MAX from GROUP BY 有多个 HAVING 子句(我认为)
【发布时间】:2014-02-07 00:48:01
【问题描述】:

我的桌子:

  id    user    area    login         colour
  ------------------------------------------
  1     2       7      2014-01-05     red
  2     1       7      2014-01-03     green
  3     3       7      2014-01-08     red
  4     2       7      2014-01-22     green
  5     3       7      2014-01-15     amber
  6     1       7      2014-01-12     green
  7     3       7      2014-01-23     red
  8     4       7      2014-01-05     red
  9     3       7      2014-01-12     green
 10     4       7      2014-01-28     amber
 11     1       4      2014-01-06     amber

仅来自每个用户最后一次登录的列表(即 MAX(login)) 我需要统计来自区域 7 的绿色登录次数

从给定的表中,ID 4、6 和 9 具有区域 7 的最新登录日期,颜色为绿色,因此我希望我的查询返回它们的计数,即 3。

头疼的时间。

【问题讨论】:

  • 这是用于 SQL_Server 的吗?
  • 用户 2 是否也符合您的条件?
  • user=3 的最后一次登录是 2014-01-23red。为什么要这样算?
  • 是的,它适用于 ms sql server,用户 2 确实符合条件,这就是为什么 id 为 4 的行包含在结果中,我的错误,请修改第 7 行,使登录日期处于文艺复兴后期.感谢您的关注。

标签: sql tsql group-by max having


【解决方案1】:

如果是SQL-Server,可以使用windows聚合函数:

; WITH cte AS
  ( SELECT login, area, colour, 
           maxlogin = MAX(login) OVER (PARTITION BY [user]) 
    FROM dbo.logins
  )
SELECT COUNT(*) AS cnt
FROM cte
WHERE maxlogin = login
  AND area = 7
  AND colour = 'green' ;

测试于 SQL-Fiddle

【讨论】:

  • 太棒了。我看到这是如何工作的,不幸的是,当我在示例数据上运行它时(第 7 行日期设置为 1664),我只收到 2 个计数。我做错了什么吗?
  • 1664?那是约会吗?
  • 我为我的轻率道歉。从文艺复兴晚期开始应用到第 7 行以回答您最初的问题是一年(2013 年也可以)。然后,这会将具有最新登录日期的行留在区域 7 中,绿色为 4,6 和 9 - 总共 3。
  • 刚刚有人向我指出,第 5 行也应该是 2013 年。难怪noon能够回答这个问题。简而言之:获取所有用户的最新登录信息,并返回区域 7 和绿色的用户数。
  • 困惑。我的查询是否回答了您的问题?它会按照您的规范进行操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 2021-08-15
  • 2011-12-24
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多