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

如何合并两个独立有效的SQL查询以获取目标结果?

合并两个SQL查询以获取目标结果

现有两个独立SQL查询

查询1:从SettlementDate表指定日期拉取第一条记录

该查询仅返回SettlementDate表中匹配日期的PromptIndicator=1的记录:

SELECT
    R.TradeDate,
    R.PromptIndicator,
    SUM(CASE WHEN S.PRODUCT = 69 AND R.PromptIndicator = 1 THEN R.VALUE ELSE NULL END) AS "WTI"
FROM 
    Argus.dbo.FC_Record AS R
INNER JOIN 
    Argus.dbo.SettlementDate AS S ON R.TradeDate = S.TradeDate 
                                  AND R.Product = S.Product
WHERE 
    R.Product = 69
    AND R.ValuationType = 3
    AND R.Term = 2
    AND R.PromptIndicator = 1
GROUP BY 
    R.TradeDate, R.PromptIndicator
ORDER BY 
    R.TradeDate ASC

查询结果:

TradeDatePromptIndicatorWTI
01/21/2020158.34
02/20/2020153.78
03/20/2020122.43
04/21/2020110.01
05/19/2020132.5
06/22/2020140.46
07/21/2020141.96

查询2:拉取最新日期(不在SettlementDate表也可)的数据

该查询返回最新TradeDate下PromptIndicator<61的前60条记录:

SELECT TOP 60 
    R.TradeDate,
    R.PromptIndicator,
    SUM(CASE WHEN R.PRODUCT = 69 THEN R.VALUE ELSE 0 END) AS "WTI"
FROM 
    Argus.dbo.FC_Record AS R
WHERE 
    R.Product = 69
    AND R.ValuationType = 3
    AND R.Term = 2
    AND R.PromptIndicator < 61
GROUP BY 
    R.TradeDate, R.PromptIndicator
ORDER BY 
    R.TradeDate DESC, R.PromptIndicator ASC

查询结果:

TradeDatePromptIndicatorWTI
02/23/2023175.24
02/23/2023275.39
02/23/2023375.6
02/23/2023475.68
02/23/2023575.57
02/23/2023675.33

期望结果

需要合并得到:近期SettlementDate的PromptIndicator=1记录 + 最新日期的全PromptIndicator<61记录,按日期升序、指标升序排列:

TradeDatePromptIndicatorWTI
09/20/2022184.45
10/20/2022185.98
11/21/2022179.73
12/20/2022176.09
01/20/2023181.31
02/21/2023176.16
02/23/2023175.24
02/23/2023275.39
02/23/2023375.6
02/23/2023475.68
02/23/2023575.57
02/23/2023675.33

使用UNION合并后的异常结果

直接用UNION合并后出现无关记录,排序混乱:

TradeDatePromptIndicatorWTI
02/21/2023176.16
01/24/20234365.8
01/20/2023181.31
01/18/20232969.6
12/20/2022176.09
12/16/2022774.04

正确的合并方法

直接UNION会合并所有结果,包括不需要的旧日期多指标记录,且重复的最新日期指标会被错误处理。正确做法是拆分逻辑后再合并:

  1. 先获取最新的交易日期
  2. 从第一个查询中排除最新日期的记录,避免重复
  3. 从第二个查询中仅保留最新日期的所有符合条件的记录
  4. 用UNION ALL合并两部分(无重复,效率更高),最后统一排序

完整SQL代码:

-- 定义变量存储最新交易日期
DECLARE @LatestTradeDate DATE = (
    SELECT MAX(TradeDate) 
    FROM Argus.dbo.FC_Record 
    WHERE Product = 69 
      AND ValuationType = 3 
      AND Term = 2
)

-- 第一部分:SettlementDate中早于最新日期的PromptIndicator=1记录
SELECT
    R.TradeDate,
    R.PromptIndicator,
    SUM(CASE WHEN S.PRODUCT = 69 AND R.PromptIndicator = 1 THEN R.VALUE ELSE NULL END) AS "WTI"
FROM 
    Argus.dbo.FC_Record AS R
INNER JOIN 
    Argus.dbo.SettlementDate AS S ON R.TradeDate = S.TradeDate 
                                  AND R.Product = S.Product
WHERE 
    R.Product = 69
    AND R.ValuationType = 3
    AND R.Term = 2
    AND R.PromptIndicator = 1
    AND R.TradeDate < @LatestTradeDate -- 排除最新日期,避免重复
GROUP BY 
    R.TradeDate, R.PromptIndicator

UNION ALL

-- 第二部分:最新日期的所有PromptIndicator<61记录
SELECT
    R.TradeDate,
    R.PromptIndicator,
    SUM(CASE WHEN R.PRODUCT = 69 THEN R.VALUE ELSE 0 END) AS "WTI"
FROM 
    Argus.dbo.FC_Record AS R
WHERE 
    R.Product = 69
    AND R.ValuationType = 3
    AND R.Term = 2
    AND R.PromptIndicator < 61
    AND R.TradeDate = @LatestTradeDate -- 仅保留最新日期
GROUP BY 
    R.TradeDate, R.PromptIndicator

-- 最终统一排序
ORDER BY 
    TradeDate ASC, 
    PromptIndicator ASC

说明

  • 用UNION ALL替代UNION:已经通过日期过滤避免了重复记录,UNION ALL无需去重,性能更好
  • 统一排序:合并后再排序,确保结果按日期升序、指标升序排列,完全匹配期望格式
  • 日期过滤:精准拆分两部分数据,避免重复,同时保证只保留需要的记录

内容的提问来源于stack exchange,提问作者gwhb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:17:07