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