如何合并两个独立有效的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
查询结果:
| TradeDate | PromptIndicator | WTI |
|---|---|---|
| 01/21/2020 | 1 | 58.34 |
| 02/20/2020 | 1 | 53.78 |
| 03/20/2020 | 1 | 22.43 |
| 04/21/2020 | 1 | 10.01 |
| 05/19/2020 | 1 | 32.5 |
| 06/22/2020 | 1 | 40.46 |
| 07/21/2020 | 1 | 41.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
查询结果:
| TradeDate | PromptIndicator | WTI |
|---|---|---|
| 02/23/2023 | 1 | 75.24 |
| 02/23/2023 | 2 | 75.39 |
| 02/23/2023 | 3 | 75.6 |
| 02/23/2023 | 4 | 75.68 |
| 02/23/2023 | 5 | 75.57 |
| 02/23/2023 | 6 | 75.33 |
期望结果
需要合并得到:近期SettlementDate的PromptIndicator=1记录 + 最新日期的全PromptIndicator<61记录,按日期升序、指标升序排列:
| TradeDate | PromptIndicator | WTI |
|---|---|---|
| 09/20/2022 | 1 | 84.45 |
| 10/20/2022 | 1 | 85.98 |
| 11/21/2022 | 1 | 79.73 |
| 12/20/2022 | 1 | 76.09 |
| 01/20/2023 | 1 | 81.31 |
| 02/21/2023 | 1 | 76.16 |
| 02/23/2023 | 1 | 75.24 |
| 02/23/2023 | 2 | 75.39 |
| 02/23/2023 | 3 | 75.6 |
| 02/23/2023 | 4 | 75.68 |
| 02/23/2023 | 5 | 75.57 |
| 02/23/2023 | 6 | 75.33 |
使用UNION合并后的异常结果
直接用UNION合并后出现无关记录,排序混乱:
| TradeDate | PromptIndicator | WTI |
|---|---|---|
| 02/21/2023 | 1 | 76.16 |
| 01/24/2023 | 43 | 65.8 |
| 01/20/2023 | 1 | 81.31 |
| 01/18/2023 | 29 | 69.6 |
| 12/20/2022 | 1 | 76.09 |
| 12/16/2022 | 7 | 74.04 |
正确的合并方法
直接UNION会合并所有结果,包括不需要的旧日期多指标记录,且重复的最新日期指标会被错误处理。正确做法是拆分逻辑后再合并:
- 先获取最新的交易日期
- 从第一个查询中排除最新日期的记录,避免重复
- 从第二个查询中仅保留最新日期的所有符合条件的记录
- 用
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
相关产品推荐
相关产品推荐

