使用 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')
。
我正在使用 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')
。