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