【问题标题】:How do you join on an aggregate function result in SQL Server?如何在 SQL Server 中加入聚合函数结果?
【发布时间】:2018-06-13 19:12:08
【问题描述】:

我正在查询带有列的市场分钟数据表:

date, time, symbol, open, high, low, close

我想获取每天的最后一列。这是我想出的:

select 
    a.[Date], a.Symbol, Max(a.[Time]) as max_time, b.[Close] 
from 
    MinuteData2016 as a
join 
    MinuteData2016 as b on a.[Date] = b.[Date] 
                        and a.Symbol = b.Symbol 
                        and b.Time = max_time 
where
    (a.Symbol = 'AAPL' or a.Symbol = 'ADBE')
    and (a.[Date]=20171102 or a.[Date]= 20171103 )
    and a.[Time] > 1600
group by 
    a.Symbol, a.[Date]

我得到这个错误:

列名“max_time”无效。

【问题讨论】:

标签: sql sql-server tsql select


【解决方案1】:

我认为使用窗口函数来实现这一点会容易得多:

SELECT [date], [symbol], [time], [close]
FROM   (SELECT [date], [symbol], [time], [close],
               ROW_NUMBER() OVER (PARTITION BY [date], [symbol]
                                  ORDER BY [time] DESC) AS rn
        FROM   MinuteData2016
        WHERE  [symbol] IN ('AAPL', 'ADBE') AND
               [Date] IN (20171102, 20171103) AND
               [time] > 1600) t
WHERE  t.rn = 1

【讨论】:

  • 我对该表的典型查询需要几秒钟。但是,此查询将永远进行。它已经运行了7分钟了?你知道这是为什么吗?
  • @bkarj 我完全忽略了您原始问题中的where 子句,抱歉-我刚刚编辑了它。尝试使用它运行,它应该会快得多。
  • 好的,现在只需不到一秒钟。谢谢。您还需要在内部查询中使用 [time],否则外部不知道那是什么。
  • @bkarj arg,复制和错误综合症 :-) 感谢您的注意 - 也编辑过
猜你喜欢
  • 1970-01-01
  • 2017-01-29
  • 2020-06-08
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 2010-11-17
  • 2022-09-28
相关资源
最近更新 更多