使用 pivot 时如何 return 想要的记录

How can I return desired record when using pivot

我正在使用 table 到 return 在过去 7 天内更新的记录。如果帐户已更新,只需 return 输入 'AAA' 和 'BBB' 作为 ID。每个ID最多可以有8个'types'。我只想 return 记录 cont_desc= 01 但不是 AAA 或 BBB 的类型,cont_desc 不必是 01。话虽如此,我想要所有 cont_desc 在 pivot table 中为 01。解释起来有点困难,所以我举个例子:

Table 可以看起来像这样:

ID    contype     date         contdesc
1     AAA         2020-01-30   01
1     AAA         2019-05-05   0002
1     BBB         2020-01-02   01
1     CCC         2020-02-23   38372
2     AAA         2020-01-22   93021
2     AAA         2020-01-30   01
2     BBB         2019-03-09   01
2     DDD         2020-02-20   92821

注意,ID 1 将被拉取,因为 CCC 在过去 7 天内进行了最后一次更新,因此它将 return ID 的 AAA 和 BBB 记录。 另请注意,ID 2 将被提取,因为 contype DDD 在过去 7 天内已更新,但它会提取 AAA,id_cont_desc = 93021。我希望记录始终为 01。我不能将其包含在我的 where 子句中,因为不是 AAA 或 BBB 的记录不一定是 01。

SELECT *
FROM( SELECT
        id_nbr AS ID,
        contact_type AS contype,
        contact_id_desc AS contdesc
      FROM table
      WHERE ((contact_type = 'AAA' OR contact_type = 'BBB' AND cont_id_desc = '01') OR contact_type NOT = 'AAA' OR 
        contact_type NOT = 'BBB'
        AND (last_update >= CURRENT_DATE - INTERVAL '7' DAY)
        QUALIFY ROW_NUMBER() OVER (PARTITION BY id_nbr, contact_type
        ORDER BY last_update) = 1) as internal_select
      PIVOT (MAX(contype) contype,MAX(contdesc) contdesc FOR contype IN ('AAA','BBB')) derived_Pilot;

它可能 return 类似于:

  ID  'AAA'_contype     'AAA'_contdesc   'BBB'_contype     'BBB'_contdesc
  1    AAA              01                BBB               01
  2    AAA              93021             BBB               01

记录 1 看起来很棒。所有 contdesc 都等于 01。注意记录 2,'AAA'_contdesc = 93021。 这是因为记录不等于 AAA 或 BBB(但在过去 7 天内已更新)但 returned contype AAA with contdesc 不等于 01。我提前道歉,这有点令人困惑但我尽力了。

如有任何建议,我们将不胜感激!提前致谢!

这是你想要的吗?

select t.*
from (select t.*,
             max(date) over (partition by id) as max_date
      from t
     ) t
where max_date >= CURRENT_DATE - INTERVAL '7' DAY) and
      contract_type in ('AAA', 'BBB') and
      contdesc = '01';

那么您想要的结果应该是:

select id,
       max(case when contract_type = 'AAA' then contract_type end) as AAA_contract_type,
       max(case when contract_type = 'AAA' then contdesc end) as AAA_contdesc,
       max(case when contract_type = 'BBB' then contract_type end) as BBB_contract_type,
       max(case when contract_type = 'BBB' then contdesc end) as BBB_contdesc
from (select t.*,
             max(date) over (partition by id) as max_date
      from t
     ) t
where max_date >= CURRENT_DATE - INTERVAL '7' DAY) and
      contract_type in ('AAA', 'BBB') and
      contdesc = '01'
group by id;

你得到了错误的结果,因为你混合了 AND 和 OR 而优先顺序不是 - AND - OR。您当前的查询结果为:

WHERE 
  ((contact_type = 'AAA'
     OR (contact_type = 'BBB' AND cont_id_desc = '01')
   )
  OR contact_type NOT = 'AAA'
  OR (contact_type NOT = 'BBB'
       AND (last_update >= Current_Date - INTERVAL '7' DAY))

这可能不是您想要的。顺便说一句,您的 Select 中缺少 ),剪切和粘贴错误?

混合 AND/OR 时应始终添加括号,另外 contact_type = 'AAA' OR contact_type = 'BBB' 应简化为 contact_type IN ('AAA', 'BBB')