查找在同一天参加多个旅游的导游

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_startguide 进行分组,看起来您想要投影的不仅仅是 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