【问题标题】:SQL Server aggregate function without group by没有分组依据的 SQL Server 聚合函数
【发布时间】:2021-12-02 02:07:00
【问题描述】:

我想包含tcon.Inductive_Injection_Hourstcon.Capacitive_Injection_Hours 而不应用分组依据。我该怎么做?

SELECT 
    bp.Serial_Number, 
    tcon.Serial_Number AS ConverterSerialNumber, 
    MAX(tcon.Time_Stamp) AS DateStamp,  
    tcon.Inductive_Injection_Hours, 
    tcon.Capacitive_Injection_Hours
FROM 
    dbo.Bypass AS bp 
INNER JOIN 
    dbo.Converter AS c ON bp.Bypass_ID = c.Bypass_ID 
INNER JOIN 
    dbo.Converter_Tel_Data AS tcon ON c.Converter_ID = tcon.Converter_ID
WHERE 
    (bp.Site_ID = 7)
GROUP BY 
    bp.Serial_Number, tcon.Serial_Number, 
    tcon.Inductive_Injection_Hours, tcon.Capacitive_Injection_Hours
ORDER BY 
    ConverterSerialNumber

【问题讨论】:

  • 改用OVER 子句。
  • “不应用分组依据”是什么意思?你想聚合还是不聚合?如果不是,你想要什么?
  • 提供样本数据和所需的输出
  • 我只需要获取最大日期的数据,我认为聚合函数需要一个 group by 子句。

标签: sql sql-server sql-server-2012


【解决方案1】:

我想通了。

select [data].Serial_Number,Time_Stamp,Inductive_Injection_Hours,Capacitive_Injection_Hours,b.Serial_Number from Converter_Tel_Data as [data]
inner join dbo.Converter AS c On [data].Converter_ID = c.Converter_ID
inner join dbo.Bypass as b on c.Bypass_ID = b.Bypass_ID
WHERE
  (Time_Stamp = (SELECT MAX(Time_Stamp) FROM Converter_Tel_Data WHERE Converter_ID = [data].Converter_ID)) And ([data].Site_ID=7)

 ORDER BY [data].Serial_Number

【讨论】:

  • 选择组中的第一行(或最后一行或前 10 行或...)是一个永恒的问题。虽然根据您的设计和使用情况,这可能就足够了,但它并非万无一失,因为它假定组内的所有行都具有唯一的 Time_Stamp 值(即没有重复)。搜索“第一组”寻找替代方案。
  • @SM或者你是对的。我有每行时间戳的数据是唯一的。如果不是唯一的解决方案是什么?
【解决方案2】:

您可以使用 row_number - 在 CTE/派生表中或使用 TOP 1 的技巧。

Select Top 1 With Ties
       bp.Serial_Number
     , tcon.Serial_Number AS ConverterSerialNumber
     , tcon.Time_Stamp AS DateStamp
     , tcon.Inductive_Injection_Hours
     , tcon.Capacitive_Injection_Hours
  From dbo.Bypass AS bp 
 Inner Join dbo.Converter AS c On bp.Bypass_ID = c.Bypass_ID 
 Inner Join dbo.Converter_Tel_Data AS tcon ON c.Converter_ID = tcon.Converter_ID
 Where bp.Site_ID = 7
 Order By
       row_number() over(Partition By bp.Serial_Number Order By tcon.Time_Stamp desc)

这应该返回 tconn 表中每个 bp.Serial_Number 的最新行。

【讨论】:

  • 这并没有给我正确的输出。这个查询也需要双倍的时间。
猜你喜欢
  • 2010-09-08
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多