Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle-用于获取重复字段的基于条件的查询_Sql_Oracle - Fatal编程技术网

Sql Oracle-用于获取重复字段的基于条件的查询

Sql Oracle-用于获取重复字段的基于条件的查询,sql,oracle,Sql,Oracle,有人能帮我查询这个复杂的场景吗 我有以下三张桌子 表格:位置 ID LOCATION_ID START_DT END_DT 21234 123 19-JUL-17 (null) 12345 345 19-JUL-17 (null) 12345 456 19-JUL-17 19-DEC-17 12345 567 19-JUL-16 (null) 1

有人能帮我查询这个复杂的场景吗

我有以下三张桌子

表格:位置

ID      LOCATION_ID     START_DT    END_DT
21234   123             19-JUL-17   (null)
12345   345             19-JUL-17   (null)
12345   456             19-JUL-17   19-DEC-17
12345   567             19-JUL-16   (null)
12345   678             19-JUL-16   (null)
12345   789             19-JUL-17   (null)
12345   890             19-JUL-17   (null)
23456   901             07-JAN-18   (null)
23456   902             19-JAN-17   (null)
表格:联系人组

LOCATION_ID     METHOD_ID
123             9999
345             8888
456             7777
567             6666
678             5555
789             4444
890             3333
901             2222
902             1111
表格:联系方式

METHOD_ID   REF_NUM     METHOD_TYPE
9999        24856584    CELL PHONE
8888        64896572    HOME PHONE
7777        65948725    HOME PHONE
6666        36564852    HOME PHONE
5555        abc@xyz.com PRIMARY EMAIL
4444        cde@xyz.com PRIMARY EMAIL
3333        45789658    ALTERNATE PHONE
2222        86594758    HOME PHONE
1111        59857468    HOME PHONE
预期结果

ID      LOCATION_ID     REF_NUM         METHOD_TYPE     START_DT    END_DT
12345   567             36564852        HOME PHONE      19-JUL-16   (null)
12345   678             abc@xyz.com     PRIMARY EMAIL   19-JUL-16   (null)
23456   902             59857468        HOME PHONE      19-JAN-17   (null)
标准

ID      LOCATION_ID     REF_NUM         METHOD_TYPE     START_DT    END_DT
12345   567             36564852        HOME PHONE      19-JUL-16   (null)
12345   678             abc@xyz.com     PRIMARY EMAIL   19-JUL-16   (null)
23456   902             59857468        HOME PHONE      19-JAN-17   (null)
返回的字段

  • END_DT为空(即激活的ID)
  • 方法类型字段重复(即REF\u NUM不必相同,但 方法(类型重复)
  • 选择多个值中最早的值(即 多个重复字段,结果位置\u ID必须为 其中最早的是通过比较START_DT)
在某种程度上,我一直在尝试

SELECT L.id, 
       L.location_id, 
       CM.ref_num, 
       CM.method_type, 
       L.start_dt, 
       L.end_dt 
FROM   location L 
       JOIN contactgroup CG 
         ON CG.location_id = L.location_id 
       JOIN contactmethod CM 
         ON CM.method_id = CG.method_id 
WHERE  L.end_dt IS NULL 
GROUP  BY L.id, 
          L.location_id, 
          CM.ref_num, 
          CM.method_type, 
          L.start_dt, 
          L.end_dt 
HAVING Count(*) > 1 

单靠GROUPBY和count子句无法实现这一点。您必须使用子查询。
此外,纯粹从提交的数据来看,人们需要做出假设。ref_num是否与此相关?因为ref_num中有所有唯一的值。

单靠group by和count子句无法实现这一点。您必须使用子查询。
此外,纯粹从提交的数据来看,人们需要做出假设。ref_num是否与此相关?因为在ref_num中有所有唯一的值。

所以可以实现如下所示的预期结果-

SELECT 
    ID,LOCATION_ID,REF_NUM,METHOD_TYPE,START_DT,END_DT
FROM 
(
    SELECT 
        A.* ,
        DENSE_RANK() OVER (PARTITION BY ID, METHOD_TYPE ORDER BY START_DT DESC) AS RNK
    FROM 
    (
        SELECT 
            L.ID,L.LOCATION_ID,CM.REF_NUM,CM.METHOD_TYPE,L.START_DT,L.END_DT
        FROM 
            LOCATION L, CONTACTMETHOD CM, CONTACTGROUP CG
        WHERE 
            L.LOCATION_ID = CG.LOCATION_ID
            AND CG.METHOD_ID = CM.METHOD_ID
            AND L.END_DT IS NULL
    ) A
) 
WHERE RNK = 2
;
        ID LOCATION_ID REF_NUM              METHOD_TYPE          START_DT  END_DT
---------- ----------- -------------------- -------------------- --------- ---------
     12345         567 36564852             HOMEPHONE            19-JUL-16
     12345         678 abc@xyz.com          PRIMARYEMAIL         19-JUL-16
     23456         902 59857468             HOMEPHONE            19-JAN-17
结果:-

SELECT 
    ID,LOCATION_ID,REF_NUM,METHOD_TYPE,START_DT,END_DT
FROM 
(
    SELECT 
        A.* ,
        DENSE_RANK() OVER (PARTITION BY ID, METHOD_TYPE ORDER BY START_DT DESC) AS RNK
    FROM 
    (
        SELECT 
            L.ID,L.LOCATION_ID,CM.REF_NUM,CM.METHOD_TYPE,L.START_DT,L.END_DT
        FROM 
            LOCATION L, CONTACTMETHOD CM, CONTACTGROUP CG
        WHERE 
            L.LOCATION_ID = CG.LOCATION_ID
            AND CG.METHOD_ID = CM.METHOD_ID
            AND L.END_DT IS NULL
    ) A
) 
WHERE RNK = 2
;
        ID LOCATION_ID REF_NUM              METHOD_TYPE          START_DT  END_DT
---------- ----------- -------------------- -------------------- --------- ---------
     12345         567 36564852             HOMEPHONE            19-JUL-16
     12345         678 abc@xyz.com          PRIMARYEMAIL         19-JUL-16
     23456         902 59857468             HOMEPHONE            19-JAN-17

可通过以下方式实现所需结果-

SELECT 
    ID,LOCATION_ID,REF_NUM,METHOD_TYPE,START_DT,END_DT
FROM 
(
    SELECT 
        A.* ,
        DENSE_RANK() OVER (PARTITION BY ID, METHOD_TYPE ORDER BY START_DT DESC) AS RNK
    FROM 
    (
        SELECT 
            L.ID,L.LOCATION_ID,CM.REF_NUM,CM.METHOD_TYPE,L.START_DT,L.END_DT
        FROM 
            LOCATION L, CONTACTMETHOD CM, CONTACTGROUP CG
        WHERE 
            L.LOCATION_ID = CG.LOCATION_ID
            AND CG.METHOD_ID = CM.METHOD_ID
            AND L.END_DT IS NULL
    ) A
) 
WHERE RNK = 2
;
        ID LOCATION_ID REF_NUM              METHOD_TYPE          START_DT  END_DT
---------- ----------- -------------------- -------------------- --------- ---------
     12345         567 36564852             HOMEPHONE            19-JUL-16
     12345         678 abc@xyz.com          PRIMARYEMAIL         19-JUL-16
     23456         902 59857468             HOMEPHONE            19-JAN-17
结果:-

SELECT 
    ID,LOCATION_ID,REF_NUM,METHOD_TYPE,START_DT,END_DT
FROM 
(
    SELECT 
        A.* ,
        DENSE_RANK() OVER (PARTITION BY ID, METHOD_TYPE ORDER BY START_DT DESC) AS RNK
    FROM 
    (
        SELECT 
            L.ID,L.LOCATION_ID,CM.REF_NUM,CM.METHOD_TYPE,L.START_DT,L.END_DT
        FROM 
            LOCATION L, CONTACTMETHOD CM, CONTACTGROUP CG
        WHERE 
            L.LOCATION_ID = CG.LOCATION_ID
            AND CG.METHOD_ID = CM.METHOD_ID
            AND L.END_DT IS NULL
    ) A
) 
WHERE RNK = 2
;
        ID LOCATION_ID REF_NUM              METHOD_TYPE          START_DT  END_DT
---------- ----------- -------------------- -------------------- --------- ---------
     12345         567 36564852             HOMEPHONE            19-JUL-16
     12345         678 abc@xyz.com          PRIMARYEMAIL         19-JUL-16
     23456         902 59857468             HOMEPHONE            19-JAN-17

正确标记!!!这是哪一个????MySql或Oracle???正确标记!!!这是哪一个????MySql或Oracle???这是答案,可能应该是一条评论。听起来你仍然需要用户提供更多的信息才能给他们一个可靠的答案。这个答案应该是一个评论。听起来您仍然需要用户提供更多信息才能给他们一个可靠的答案。创建一个临时表并通过检索临时表的排名来过滤主查询!棒 极 了非常感谢您的逻辑。创建一个临时表,并通过检索临时表的排名来过滤主查询!棒 极 了非常感谢你的逻辑。