Oracle SQL - ANY 记录的 CASE When 条件

Oracle SQL - CASE When condition for ANY record

我有一个数据库,每次 运行(打开)文档时都会在日志 table 中创建一条记录。每条记录包含 Doc_Name、Doc_Owner 和 Doc_Run_by(即 运行 文档的人)。 我正在尝试创建一个查询以查看每个文档名称,以及它是否已被所有者以外的任何人运行(即是否已共享)。

这是日志 table 的样子:

+----------+-----------+------------+
| Doc_Name | Doc_Owner | Doc_Run_by |
+----------+-----------+------------+
| A        | Bob       | Bob        |
| A        | Bob       | Joe        |
| A        | Bob       | Sam        |
| A        | Bob       | Matt       |
| B        | Matt      | Matt       |
| B        | Matt      | Bob        |
| B        | Matt      | Joe        |
| C        | Sam       | Sam        |
| D        | Bob       | Bob        |
| D        | Bob       | Matt       |
+----------+-----------+------------+

我希望查询输出如下所示:

+----------+--------------+
| Doc_Name | Share_Status |
+----------+--------------+
| A        | Y            |
| B        | Y            |
| C        | N            |
| D        | Y            |
+----------+--------------+

它会是这样的(伪sql):

SELECT distinct Doc_Name, 
    CASE 
        WHEN Doc_Owner <> Doc_Run_by for any record of each doc_name
        THEN 'Y'
        ELSE 'N'
    END as Share_Status
FROM Log_Table;

这是我目前的情况:

SELECT distinct Doc_Name, 
    CASE 
        WHEN Doc_Owner <> Doc_Run_by
        THEN 'Y'
        ELSE 'N'
    END as Share_Status
FROM Log_Table;

当前输出:

+----------+--------------+
| Doc_Name | Share_Status |
+----------+--------------+
| A        | Y            |
| A        | N            |
| B        | Y            |
| B        | N            |
| C        | N            |
| D        | Y            |
| D        | N            |
+----------+--------------+

如您所见,它为每个案例创建了一个单独的记录。我明白为什么要这样做,但我似乎无法弄清楚如何获得我想要的输出。感谢您提供的任何帮助。

这是一个肮脏的把戏,但由于 Y 大于 N,您可以使用您的查询,将其按 Doc_Name 和 select 分组最大值 Share_Status:

SELECT   Doc_Name, 
         MAX (CASE WHEN Doc_Owner <> Doc_Run_by
                   THEN 'Y'
                   ELSE 'N'
              END) as Share_Status
FROM     Log_Table
GROUP BY Doc_Name

您可以使用条件聚合:

SELECT Doc_Name, 
       CASE WHEN 
              COUNT(CASE WHEN Doc_Owner <> Doc_Run_by THEN 1 END) > 0 THEN 'Y'
            ELSE 'N'
       END AS Share_Status
FROM Log_Table 
GROUP BY Doc_Name

如果甚至有一条记录(在 Doc_Name 组记录中)具有 Doc_Owner <> Doc_Run_by,则 Share_Status 将等于 'Y',否则它将等于 'N'.

Demo here