如何在单条SELECT语句中为max(Date)和min(Date)设置不同筛选条件
解决方案:按规则计算交易的最早与最晚时间
要实现「计算最早交易时间仅包含5:00之后的记录,最晚交易时间包含所有记录」的需求,无需拆分查询再关联,直接在窗口聚合函数中通过case表达式设置筛选条件即可:
from ( select l.Name, s.ShopID, s.Day, s.Time, s.Date, -- 计算最晚交易时间:包含所有记录 max(s.Date) over (partition by s.Day) as max_date, -- 计算最早交易时间:仅包含Time≥5的记录 min(case when s.Time >= 5 then s.Date end) over (partition by s.Day) as min_date from [Shops].[Transaction].[Transactions] s INNER JOIN [Shops].[Location].[Locations] l ON s.ShopID = l.ShopID WHERE s.ShopID IN (1, 2, 3, 4, 5) AND s.Day > 20210131 AND s.Time <> 4 ) t
关键说明:
- 最早时间计算:
case when s.Time >=5 then s.Date end会把5点前的记录转为null,而min()函数会自动忽略null值,从而只统计5点后的交易时间最小值。 - 最晚时间计算:直接使用
max(s.Date),会包含所有符合WHERE条件的交易记录(包括凌晨5点前的隔夜交易)。
内容的提问来源于stack exchange,提问作者MegaKarg
相关产品推荐
相关产品推荐

