查找在同一天参加多个旅游的导游
Find Guide who work on more than one tour on the same day
OUTING_ID
TOUR_ID
OUTING_START
GUIDE
21000167
100345
30-APR-21
982354
21000168
100345
16-MAY-21
982354
21000170
100348
17-JUN-21
183476
21000200
100411
21-MAY-21
982354
21000202
100411
03-JUN-21
183476
21000205
100419
21-MAY-21
982354
21000207
100437
07-MAY-21
208655
以上定义table描述了郊游的数据table。
我需要在同一天进行不止一次旅行的导游。
我通过查询需要以下数据。
OUTING_ID
TOUR_ID
OUTING_START
GUIDE
21000200
100411
21-MAY-21
982354
21000205
100419
21-MAY-21
982354
我尝试了很多解决方案,但没有得到我想要的。
我也尝试使用以下查询,但没有按照我的数据要求为我工作。
SELECT
"A2O".GUIDE
FROM
A2_OUTING "A2O"
WHERE
OUTING_START IN (SELECT OUTING_START
FROM A2_OUTING
GROUP BY OUTING_START
HAVING COUNT(*) > 1);
我试了一整天,现在我很沮丧,请帮助我。
提前致谢!
可以使用COUNT() OVER ()
等解析函数
SELECT outing_id, tour_id, outing_start, guide
FROM (SELECT COUNT(*) OVER (PARTITION BY outing_start,guide) AS cnt, a.*
FROM a2_outing a)
WHERE cnt > 1
对于您的解决方案,您需要按 outing_start
和 guide
进行分组,看起来您想要投影的不仅仅是 guide
列。
正如 mathguy 在另一条评论中指出的那样,这仅在 outing_start
的时间分量完全相同时才有效。如果需要,您可以使用 trunc
函数来执行此操作。
SELECT outing_id, tour_id, outing_start, guide FROM A2_OUTING "A2O" WHERE (OUTING_START, guide) IN (
SELECT OUTING_START, guide FROM A2_OUTING GROUP BY OUTING_START, guide HAVING COUNT(*)>1
);
另一种解决方案是使用分析计数,这样您就不需要连接了。
SELECT outing_id, tour_id, outing_start, guide
FROM (
SELECT outing_id, tour_id, outing_start, guide
,count(*) over (partition by outing_start, guide) cnt
FROM A2_OUTING ) sq
Where cnt > 1
OUTING_ID | TOUR_ID | OUTING_START | GUIDE |
---|---|---|---|
21000167 | 100345 | 30-APR-21 | 982354 |
21000168 | 100345 | 16-MAY-21 | 982354 |
21000170 | 100348 | 17-JUN-21 | 183476 |
21000200 | 100411 | 21-MAY-21 | 982354 |
21000202 | 100411 | 03-JUN-21 | 183476 |
21000205 | 100419 | 21-MAY-21 | 982354 |
21000207 | 100437 | 07-MAY-21 | 208655 |
以上定义table描述了郊游的数据table。
我需要在同一天进行不止一次旅行的导游。 我通过查询需要以下数据。
OUTING_ID | TOUR_ID | OUTING_START | GUIDE |
---|---|---|---|
21000200 | 100411 | 21-MAY-21 | 982354 |
21000205 | 100419 | 21-MAY-21 | 982354 |
我尝试了很多解决方案,但没有得到我想要的。 我也尝试使用以下查询,但没有按照我的数据要求为我工作。
SELECT
"A2O".GUIDE
FROM
A2_OUTING "A2O"
WHERE
OUTING_START IN (SELECT OUTING_START
FROM A2_OUTING
GROUP BY OUTING_START
HAVING COUNT(*) > 1);
我试了一整天,现在我很沮丧,请帮助我。
提前致谢!
可以使用COUNT() OVER ()
等解析函数
SELECT outing_id, tour_id, outing_start, guide
FROM (SELECT COUNT(*) OVER (PARTITION BY outing_start,guide) AS cnt, a.*
FROM a2_outing a)
WHERE cnt > 1
对于您的解决方案,您需要按 outing_start
和 guide
进行分组,看起来您想要投影的不仅仅是 guide
列。
正如 mathguy 在另一条评论中指出的那样,这仅在 outing_start
的时间分量完全相同时才有效。如果需要,您可以使用 trunc
函数来执行此操作。
SELECT outing_id, tour_id, outing_start, guide FROM A2_OUTING "A2O" WHERE (OUTING_START, guide) IN (
SELECT OUTING_START, guide FROM A2_OUTING GROUP BY OUTING_START, guide HAVING COUNT(*)>1
);
另一种解决方案是使用分析计数,这样您就不需要连接了。
SELECT outing_id, tour_id, outing_start, guide
FROM (
SELECT outing_id, tour_id, outing_start, guide
,count(*) over (partition by outing_start, guide) cnt
FROM A2_OUTING ) sq
Where cnt > 1