sql - ORACLE SQL : Returning only non primary account holders who joined later or from different channel from primary?

标签 sql oracle

我有以下数据,其中每个帐户 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/

相关文章:

java - 在 Java 中使用 SQL 语句插入数字数据类型

mysql - 数据库 SQL 查询按第一列对结果进行分组

sql - 在 SQL 中双重转义通配符是否会使转义无效?

c++ - 哪种机制使 Oracle session 在服务器上保持事件状态?

oracle - 简单的 Oracle UPDATE 语句性能异常糟糕

sql - Oracle SQL 语法 - 检查多个列是否为 IS NOT NULL

java - 如何设置 Hibernate 配置属性以使用 Fabric 驱动程序连接到 Mysql

MySQL - 无法在 mysql 5.7 上使用 REFERENCES(但在 5.0 上工作)

java - SQL语法错误异常 : ORA-00911: invalid character

java - Resultset.getDate() 抛出异常 java.lang.NumberFormatException : For input string: "Name of Month"