【问题标题】:SQL Server query (MAX+COUNT)SQL Server 查询 (MAX+COUNT)
【发布时间】:2020-10-07 21:00:15
【问题描述】:

我目前正在 Microsoft SQL Server 上进行快速查询,该查询应返回不同的 INSTALLATION,该 INSTALLATION 在去年具有 MAX 数量的 EVENTS。

这是我到目前为止所得到的,但我知道这不是正确的方法,并希望获得一些见解:

SELECT 
    i.idInstalac, i.nomInstalac, COUNT(e.idEvento) as cantEventos    
FROM
    Instalacion i, Eventos e    
WHERE 
    i.idInstalac = e.idInstalac 
    AND YEAR(e.fchEvento) = 2019   
GROUP BY 
    i.idInstalac, i.nomInstalac
HAVING 
    MAX cantEventos

谢谢

【问题讨论】:

标签: sql sql-server date sql-order-by where-clause


【解决方案1】:

一个简单的解决方案是TOP (1) WITH TIES:

SELECT TOP (1) WITH TIES i.idInstalac, i.nomInstalac, COUNT(e.idEvento) as cantEventos 
FROM Instalacion i
INNER JOIN Eventos e ON i.idInstalac = e.idInstalac 
WHERE e.fchEvento >= '2019-01-01' and e.fchEvento < '2020-01-01'
GROUP BY i.idInstalac,i.nomInstalac 
ORDER BY cantEventos DESC

请注意,我将您的隐式 JOIN 重写为显式的现代连接(使用 ON 关键字):隐式连接是一种旧语法,不应在新代码中使用。我还更改了WHERE 子句中的日期过滤器:在列上使用日期函数效率较低,并且会阻止数据库使用现有索引

【讨论】:

  • 感谢您的快速跟进。抱歉,我刚刚完成了对初始帖子的编辑,因为它有点聚集(一种新的发布问题)。我理解使用 TOP,但如果有 2 个或更多具有相同数量的事件,则这一特定应该带来所有不同设施具有相同数量事件的情况
  • 不熟悉“WITH TIES”,也许这就是我想念的东西
  • @juanmaperez:是的,WITH TIES 就是这样做的。
  • 认为这可能是我在 TIES 格式中寻找的内容,也感谢您对不同变化的洞察力,我将尽快将其标记为已回答。
猜你喜欢
  • 2012-12-26
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 2018-02-14
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多