代码之家  ›  专栏  ›  技术社区  ›  NuCradle

如何在Oracle中使用分区获得记录计数

  •  -1
  • NuCradle  · 技术社区  · 6 年前

    我有以下疑问:

    SELECT 
        F.IID, 
        F.E_NUM AS M_E_NUM, 
        MCI.E_NUM AS MCI_E_NUM, 
        F.C_NUM AS M_C_NUM, 
        MCI.C_NUM AS MCI_C_NUM,
        F.ET_ID AS M_ET_ID, 
        EDIE.ET_ID AS ED_INDV_ET_ID,
        COUNT(*) OVER (PARTITION BY F.IID) IID_COUNT
    FROM FT_T F JOIN CEMEI_T MCI ON F.IID = MCI.IID
        JOIN EDE_T EDE ON MCI.E_NUM = EDE.E_NUM
        JOIN EDIE_T EDIE ON EDIE.IID = F.IID AND EDIE.ET_ID = EDE.ET_ID
    WHERE 
        F.DEL_F = 'N'
        AND MCI.EFF_END_DT IS NULL
        AND MCI.TOS = 'BVVB'
        AND EDE.PTEND_DT IS NULL
        AND EDE.DEL_S = 'N'
        AND EDE.CUR_IND = 'A'
        AND EDIE.TAR_N = 'Y'
        AND F.IID IN
            (
             SELECT DISTINCT IID 
             FROM FT_T 
             WHERE GROUP_ID = 'BG' 
                AND DEL_F = 'N' 
                AND (IID, E_NUM) NOT IN 
                    (
                     SELECT IID, E_NUM FROM CEMEI_T 
                     WHERE TOS = 'BVVB' AND EFF_END_DT IS NULL
                    )
            );
    

    我基本上是从几个表中获取信息并创建它们的平面记录。

    一切都是这样的,除了现在我需要找出是否有两个记录在 FT_T IID ,并将其显示为结果集的一部分。

    我尝试使用分区,但是结果集中的所有行都返回一个计数,即使其中有两个记录具有相同的值 是的

    我最初说我从几个表中收集信息的原因是 如果两个记录不适用于同一个,则可能没有我需要的所有信息 IID公司 ,所以我必须从其他表中检索它们 JOIN 在查询中被删除。但是,我需要知道 FT_T.IID 他有两张唱片 英尺 (或大于一个)。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    join 和过滤:

    SELECT . . .
    FROM (SELECT F.*,
                 COUNT(*) OVER (PARTITION BY F.IID) as IID_CNT
          FROM FT_T F
         ) JOIN
         CEMEI_T MCI
         ON F.IID = MCI.IID JOIN
         EDE_T EDE
         ON MCI.E_NUM = EDE.E_NUM JOIN
         EDIE_T EDIE
         ON EDIE.IID = F.IID AND EDIE.ET_ID = EDE.ET_ID
     . . .
    
        2
  •  0
  •   Adrian Maxwell    6 年前

    这只是一个注释/观察,但需要格式化

    你使用 in(...) 具有 select distinct not in(...,...) 似乎很复杂,如果某些值为NULL,则可能会出现问题。我建议你考虑使用存在而不是存在。例如

    AND EXISTS (
        SELECT
            NULL
        FROM FT_T
        WHERE F.IID = FT_T.IID
        AND FT_T.GROUP_ID = 'BG'
        AND FT_T.DEL_F = 'N'
        AND NOT EXISTS (
            SELECT
                NULL
            FROM CEMEI_T
            WHERE FT_T.IID = CEMEI_T.IID
            AND FT_T.E_NUM = CEMEI_T.E_NUM
            AND CEMEI_T.TOS = 'BVVB'
            AND CEMEI_T.EFF_END_DT IS NULL
        )
    )