SQL 合并日期并将其转换为 MM/YYYY
SQL Concat and convert date to MM/YYYY
这里是新手。预先感谢您的帮助!
我有以下代码来计算基于 3 个数据元素的唯一记录:
count(distinct concat(a.emp_nbr, b.acct_nbr, c.event_dt))
event_dt 作为 [DATE] 存储在数据库中。
问题是我不想在 concat 匹配语句中排除 'DD'。我只想根据 MM/YYYY 进行匹配。我相信答案是将 [DATE] 转换为 MM/YYYY.
最终我想根据 event_dt 的 emp_nbr、acct_nbr 和 mm/yyyy 计算不同的记录。
谢谢!
已修改
这里是查询:
select distinct
B.emp_nbr, A.cust_nbr, E.cntry_enti_nbr, A.event_dt,
count(distinct concat(B.emp_nbr, E.cntry_enti_nbr, A.event_dt))
from customer A
left join user_profile B on A.owner_ID = B.owner_ID
left join account_owner E on A.cust_nbr = E.cust_nbr
where CAST(A.ramp_dt AS date format 'MM/DD/YYYY') between '01/01/2020' and '08/31/2020'
group by 1,2,3,4
这是返回结果的示例:
ln...emp_nbr.......cust_nbr.....ctry_enti_nbr event_dt......'Unique Identifier'
1....123.......87543290......488807.......2020/15.......1
2....123.........62524497......488807......2020/28......1 **
3....123.........62524497......488807......2020/26......1 **
4....789 ......62524497 ......488807 ......2020/26......1
5....876......62524497......488807......2020/26......1
第 2 行或第 3 行不应标记为“1”(唯一)
编辑:根据 dnoeth 的 reco 更改代码以添加计数 (*) OVER (PARTITION):
select distinct
B.emp_nbr, A.cust_nbr, E.cntry_enti_nbr, A.event_dt,
to_char(A.event_dt, 'YYYYMM') as Event_Month,
case when COUNT(*) OVER (PARTITION BY B.emp_nbr, A.cntry_enti_nbr, Event_Month)
= 1 then 1 else 0 end as Unique_Monthly_Event
from customer A
left join user_profile B on A.owner_ID = B.owner_ID
left join account_owner E on A.cust_nbr = E.cust_nbr
where CAST(A.event_dt AS date format 'MM/DD/YYYY') between '01/01/2020' and '08/31/2020'
group by 1,2,3,4
在前一种情况下工作正常,但在另一种情况下,它显示唯一的全零:
ln...emp_nbr.......cust_nbr.....ctry_enti_nbr event_dt......'Unique Identifier'
1....123.......78473466......863429.......5/31/2020.......0
2....123.......78473466......863429.......5/29/2020.......0
3....123.......78473466......863429.......5/5/2020.......0
我想查看唯一标识符为“1”的一条记录
您可以使用 to_char()
。像这样:
count(distinct concat(a.emp_nbr, '|', b.acct_nbr, '|', to_char(c.event_dt, 'YYYYMM'))
或更常见:
count(distinct a.emp_nbr || '|' || b.acct_nbr || '|' || to_char(c.event_dt, 'YYYYMM')
请注意,这也在
之间放置了一个分隔符
您的查询看起来不对。我想你只是想要:
select A.cust_nbr, E.cntry_enti_nbr, to_char(c.event_dt, 'YYYYMM'),
count(*)
from customer A left join
user_profile B
on A.owner_ID = B.owner_ID left join
account_owner E
on A.cust_nbr = E.cust_nbr
where CAST(A.ramp_dt AS date format 'MM/DD/YYYY') between '01/01/2020' and '08/31/2020'
group by A.cust_nbr, E.cntry_enti_nbr, to_char(c.event_dt, 'YYYYMM');
您可以简单地使用 EXTRACT()
函数从日期中提取年份和月份。例如:
SELECT COUNT(DISTINCT CONCAT(a.emp_nbr, b.acct_nbr, EXTRACT(YEAR FROM c.event_dt), EXTRACT(MONTH FROM c.event_dt)))
FROM ...
Line 2 or 3 should NOT be flagged as '1' (unique)
...因为每个 emp_nbr/cust_nbr/ctry_enti_nbr?
不止一行
那么你需要一个简单的组数:
select
B.emp_nbr, A.cust_nbr, E.cntry_enti_nbr, A.event_dt,
-- I would like to see ONE record with a unique identifier of "1"
-- this returns the row with the latest event date
case
when row_number()
over (partition by B.emp_nbr, A.cust_nbr, E.cntry_enti_nbr
order by event_dt desc) = 1
then 1
else 0
end
from customer A
left join user_profile B on A.owner_ID = B.owner_ID
left join account_owner E on A.cust_nbr = E.cust_nbr
where CAST(A.ramp_dt AS date format 'MM/DD/YYYY') between '01/01/2020' and '08/31/2020'
group by 1,2,3,4
这里是新手。预先感谢您的帮助!
我有以下代码来计算基于 3 个数据元素的唯一记录:
count(distinct concat(a.emp_nbr, b.acct_nbr, c.event_dt))
event_dt 作为 [DATE] 存储在数据库中。
问题是我不想在 concat 匹配语句中排除 'DD'。我只想根据 MM/YYYY 进行匹配。我相信答案是将 [DATE] 转换为 MM/YYYY.
最终我想根据 event_dt 的 emp_nbr、acct_nbr 和 mm/yyyy 计算不同的记录。
谢谢!
已修改
这里是查询:
select distinct
B.emp_nbr, A.cust_nbr, E.cntry_enti_nbr, A.event_dt,
count(distinct concat(B.emp_nbr, E.cntry_enti_nbr, A.event_dt))
from customer A
left join user_profile B on A.owner_ID = B.owner_ID
left join account_owner E on A.cust_nbr = E.cust_nbr
where CAST(A.ramp_dt AS date format 'MM/DD/YYYY') between '01/01/2020' and '08/31/2020'
group by 1,2,3,4
这是返回结果的示例:
ln...emp_nbr.......cust_nbr.....ctry_enti_nbr event_dt......'Unique Identifier' 1....123.......87543290......488807.......2020/15.......1 2....123.........62524497......488807......2020/28......1 ** 3....123.........62524497......488807......2020/26......1 ** 4....789 ......62524497 ......488807 ......2020/26......1 5....876......62524497......488807......2020/26......1
第 2 行或第 3 行不应标记为“1”(唯一)
编辑:根据 dnoeth 的 reco 更改代码以添加计数 (*) OVER (PARTITION):
select distinct
B.emp_nbr, A.cust_nbr, E.cntry_enti_nbr, A.event_dt,
to_char(A.event_dt, 'YYYYMM') as Event_Month,
case when COUNT(*) OVER (PARTITION BY B.emp_nbr, A.cntry_enti_nbr, Event_Month)
= 1 then 1 else 0 end as Unique_Monthly_Event
from customer A
left join user_profile B on A.owner_ID = B.owner_ID
left join account_owner E on A.cust_nbr = E.cust_nbr
where CAST(A.event_dt AS date format 'MM/DD/YYYY') between '01/01/2020' and '08/31/2020'
group by 1,2,3,4
在前一种情况下工作正常,但在另一种情况下,它显示唯一的全零:
ln...emp_nbr.......cust_nbr.....ctry_enti_nbr event_dt......'Unique Identifier'
1....123.......78473466......863429.......5/31/2020.......0
2....123.......78473466......863429.......5/29/2020.......0
3....123.......78473466......863429.......5/5/2020.......0
我想查看唯一标识符为“1”的一条记录
您可以使用 to_char()
。像这样:
count(distinct concat(a.emp_nbr, '|', b.acct_nbr, '|', to_char(c.event_dt, 'YYYYMM'))
或更常见:
count(distinct a.emp_nbr || '|' || b.acct_nbr || '|' || to_char(c.event_dt, 'YYYYMM')
请注意,这也在
之间放置了一个分隔符您的查询看起来不对。我想你只是想要:
select A.cust_nbr, E.cntry_enti_nbr, to_char(c.event_dt, 'YYYYMM'),
count(*)
from customer A left join
user_profile B
on A.owner_ID = B.owner_ID left join
account_owner E
on A.cust_nbr = E.cust_nbr
where CAST(A.ramp_dt AS date format 'MM/DD/YYYY') between '01/01/2020' and '08/31/2020'
group by A.cust_nbr, E.cntry_enti_nbr, to_char(c.event_dt, 'YYYYMM');
您可以简单地使用 EXTRACT()
函数从日期中提取年份和月份。例如:
SELECT COUNT(DISTINCT CONCAT(a.emp_nbr, b.acct_nbr, EXTRACT(YEAR FROM c.event_dt), EXTRACT(MONTH FROM c.event_dt)))
FROM ...
Line 2 or 3 should NOT be flagged as '1' (unique)
...因为每个 emp_nbr/cust_nbr/ctry_enti_nbr?
不止一行那么你需要一个简单的组数:
select
B.emp_nbr, A.cust_nbr, E.cntry_enti_nbr, A.event_dt,
-- I would like to see ONE record with a unique identifier of "1"
-- this returns the row with the latest event date
case
when row_number()
over (partition by B.emp_nbr, A.cust_nbr, E.cntry_enti_nbr
order by event_dt desc) = 1
then 1
else 0
end
from customer A
left join user_profile B on A.owner_ID = B.owner_ID
left join account_owner E on A.cust_nbr = E.cust_nbr
where CAST(A.ramp_dt AS date format 'MM/DD/YYYY') between '01/01/2020' and '08/31/2020'
group by 1,2,3,4