我有以下数据,其中每个帐户 ID 可以有多个与其关联的成员
ACCOUNT_ID MEMBER_ENROLL_DTE PRIMARY_FLG ENROLL_CHANNEL_ID
3021 3/22/2011 1 50
3022 3/23/2011 1 50
3022 1/2/2013 0 50
3023 3/23/2011 1 50
3024 3/23/2011 1 52
3025 3/23/2011 1 52
3025 3/23/2011 0 48
3026 3/23/2011 1 52
3026 3/23/2011 0 52
我正在尝试执行以下操作: 只要同一帐户中有多个成员,如果注册日期或注册 channel 不同,则返回这些记录。
也就是说,我想按 account_id 分区,然后按注册日期、注册 channel 和 Primary_flg 排序,然后返回主标志设置为 0 且日期和 channel 与主帐户持有者不同的记录 (PRIMARY_FLG = 1) 。在这种情况下,我会得到两条记录
ACCOUNT_ID MEMBER_ENROLL_DTE PRIMARY_FLG ENROLL_CHANNEL_ID
3022 1/2/2013 0 50
3025 3/23/2011 0 48
我主要困惑于如何处理注册日期或注册 channel 不同的情况。我可以通过执行以下操作来获得所有非初选
SELECT *
FROM (
SELECT t.*,
LAG( CASE "Primary" WHEN 1 THEN 1 END ) IGNORE NULLS
OVER ( PARTITION BY account_id ORDER BY MEMBER_ENROLL_DTE, PRIMARY_FLG, ENROLL_CHANNEL_ID )
AS has_prev_primary
FROM table_name t
)
WHERE has_prev_primary = 1;
我认为这甚至可以做我想做的事,但我不是 100% 确定 - 它似乎不会返回当天加入的成员(member),但我不确定为什么。有人可以建议必要的更改吗?
最佳答案
原始答案获取帐户 ID 不匹配的所有条目。在许多情况下,这对我来说似乎更有用。
SELECT t.account_id, t.primary_flg, t.member_enroll_dte, t.enroll_channel_id
FROM table_name t
WHERE t.account_id IN (
SELECT account_id
FROM table_name t2
GROUP BY account_id
HAVING min(primary_flg) != max(primary_flg)
AND NOT (
min(member_enroll_dte) = max(member_enroll_dte) AND
min(enroll_channel_id) = max(enroll_channel_id)
)
)
ORDER BY 1,2 desc,3,4;
替代答案只会为您提供不匹配的非主要记录,仅此而已。
SELECT t.account_id, t.primary_flg, t.member_enroll_dte, t.enroll_channel_id
FROM table_name t
WHERE t.primary_flg = 0
AND NOT EXISTS (
SELECT null
FROM table_name t_sub
WHERE t_sub.account_id = t.account_id
AND t_sub.primary_flg = 1
AND t_sub.member_enroll_date = t.member_enroll_date
AND t_sub.enroll_channel_id = t.enroll_channel_id )
ORDER BY 1,3,4
尝试对您在评论中提到的查询进行此操作,其中非主要查询应位于主要查询之后。
SELECT t.account_id, t.primary_flg, t.member_enroll_dte, t.enroll_channel_id
FROM table_name t
WHERE t.primary_flg = 0
AND NOT EXISTS (
SELECT null
FROM table_name t_sub
WHERE t_sub.account_id = t.account_id
AND t_sub.primary_flg = 1
AND t_sub.enroll_channel_id = t.enroll_channel_id
AND t_sub.member_enroll_date >= t.member_enroll_date )
ORDER BY 1,3,4
关于sql - ORACLE SQL : Returning only non primary account holders who joined later or from different channel from primary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38021158/