如何获取SQL表中每个under_symbol每月符合指定条件的最早记录
SQL 实现方案
你可以借助SQL Server的ROW_NUMBER()窗口函数实现按分组取首条的需求,完整语句如下:
WITH filtered_records AS ( SELECT [under_symbol], [quote_date], [type], [percent], -- 按标的+自然月分组,组内按日期升序排序生成行号 ROW_NUMBER() OVER ( PARTITION BY [under_symbol], DATEFROMPARTS(YEAR(quote_date), MONTH(quote_date), 1) ORDER BY [quote_date] ASC ) AS row_num FROM [Underlying].[dbo].[Table_EOD] WHERE [percent] > 0.19 AND [percent] < 0.21 AND [type] = '1' ) SELECT [under_symbol], [quote_date], [type], [percent] FROM filtered_records WHERE row_num = 1;
逻辑说明
- 先用CTE筛选所有符合
percent区间、type=1的记录,同时给记录打上行号标记:PARTITION BY后的两个字段是分组依据:under_symbol是标的代码,DATEFROMPARTS(YEAR(quote_date), MONTH(quote_date), 1)会把所有日期转换为对应自然月的第一天,确保同一年同一个月的记录会被分到同一组ORDER BY [quote_date] ASC保证同一个分组内的记录按时间从早到晚排序,最早的记录行号为1
- 外层查询仅筛选行号为1的记录,就是每个标的每个自然月符合条件的第一条记录
兼容说明
如果使用的SQL Server版本低于2012,不支持DATEFROMPARTS函数,可以把PARTITION BY里的日期部分替换为CONVERT(VARCHAR(7), quote_date, 120),按YYYY-MM格式的字符串分组,效果完全相同。
另外你原查询中同时写了SELECT *和单独列字段,会触发语法报错,上述语句已经修正了该问题。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

