You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 04:24:00