Postgres SQL - 子查询

问题描述 投票:0回答:2

我们正在运行此查询:

 SELECT concat_ws(' ', z.ticker,
        CASE
          WHEN a.date_approved IS NOT NULL THEN TO_CHAR(a.date_approved,'YYMMDD')
          WHEN z.date_recommended IS NULL THEN '000000'
          ELSE TO_CHAR(z.date_recommended,'YYMMDD')
        END,
         CASE
           WHEN s.ticker IS NOT NULL THEN 6
           WHEN a.approved_recommendation IS NOT NULL THEN approved_recommendation
           ELSE current_recommendation
         END,
         REPLACE(CASE
                   WHEN comments IS NULL THEN 'N/C'
                   ELSE comments
                 END,' ','_'))
 FROM recommendations z
 LEFT JOIN (SELECT ticker FROM scr_tickers) s
        ON z.ticker = s.ticker
 LEFT JOIN (SELECT ticker, date_approved, approved_recommendation
            FROM approved_recommendations) a
        ON z.ticker = a.ticker
 WHERE z.ticker NOT LIKE 'T.%'
   AND z.ticker NOT LIKE 'V.%'
 ORDER BY z.ticker;

现在,他们想在“comments”后面添加另一个数据项,即从“recommendations_history”表中检索最近的推荐值,其中推荐值<>为当前推荐(来自推荐表)。

按顺序,我可以进行联接,使用 ROW_NUMBER 和 ORDER BY 并选择第一行。不太确定这是 Postgres SQL 中最好的方法。

所以,正在寻求一些帮助。

谢谢!

postgresql subquery
2个回答
0
投票
SELECT concat_ws(' ', z.ticker,
        COALESCE(TO_CHAR(a.date_approved,'YYMMDD'),
                 TO_CHAR(z.date_recommended,'YYMMDD'),
                 '000000'),
         CASE
           WHEN s.ticker IS NOT NULL THEN 6
           WHEN a.approved_recommendation IS NOT NULL THEN approved_recommendation
           ELSE current_recommendation
         END,
         REPLACE(COALESCE(comments,'N/C'),' ','_'))
 FROM recommendations z
 LEFT JOIN (SELECT ticker FROM scr_tickers) s
        USING (ticker)
 LEFT JOIN (SELECT ticker, date_approved, approved_recommendation
            FROM approved_recommendations) a
        USING (ticker)
 WHERE z.ticker NOT LIKE 'T.%'
   AND z.ticker NOT LIKE 'V.%'
 ORDER BY z.ticker;
  1. case when x is null then y else x end
    翻译为
    coalesce(x,y)
  2. 如果输入时获得
  3. to_char()
    ,则 
    null
    函数将返回
    null
  4. join using
    为您保存方程式并合并同名列

-1
投票

尝试一下,我引入了

LEFT JOIN
来合并
recommendations_history
表中与建议表中当前建议不同的最新建议。这是通过加入使用
ROW_NUMBER()
窗口函数的子查询来实现的,该子查询按代码分区并按推荐日期降序排列。

SELECT concat_ws(' ', 
                 z.ticker,
                 CASE
                   WHEN a.date_approved IS NOT NULL THEN TO_CHAR(a.date_approved,'YYMMDD')
                   WHEN z.date_recommended IS NULL THEN '000000'
                   ELSE TO_CHAR(z.date_recommended,'YYMMDD')
                 END,
                 CASE
                   WHEN s.ticker IS NOT NULL THEN 6
                   WHEN a.approved_recommendation IS NOT NULL THEN a.approved_recommendation
                   ELSE z.current_recommendation
                 END,
                 REPLACE(CASE
                             WHEN z.comments IS NULL THEN 'N/C'
                             ELSE z.comments
                           END, ' ', '_'),
                 COALESCE(rh.recommendation, 'No Recent Recommendation')
               )
FROM recommendations z
LEFT JOIN (SELECT ticker FROM scr_tickers) s ON z.ticker = s.ticker
LEFT JOIN (SELECT ticker, date_approved, approved_recommendation
           FROM approved_recommendations) a ON z.ticker = a.ticker
LEFT JOIN (SELECT ticker, recommendation, ROW_NUMBER() OVER (PARTITION BY ticker ORDER BY recommendation_date DESC) AS rn
           FROM recommendations_history
           WHERE recommendation <> (SELECT current_recommendation FROM recommendations WHERE ticker = recommendations_history.ticker)
          ) rh ON z.ticker = rh.ticker AND rh.rn = 1
WHERE z.ticker NOT LIKE 'T.%'
  AND z.ticker NOT LIKE 'V.%'
ORDER BY z.ticker;
© www.soinside.com 2019 - 2024. All rights reserved.