微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果一个或多个扩展为真,如何按标志将父/子记录分组并折叠为组合的单个记录,其中标志为真?

如何解决如果一个或多个扩展为真,如何按标志将父/子记录分组并折叠为组合的单个记录,其中标志为真?

抱歉,标题太长,很难描述我想要做什么。正如您将在下面看到的那样,它很容易理解,但很难概括为一个标题

我有一个返回以下数据的查询

| ParentID | ChildID | Flag |
| 100      | 1       | 0    |
| 100      | 1       | 1    |
| 100      | 2       | 0    |
| 100      | 2       | 0    |
| 200      | 1       | 1    |
| 200      | 1       | 1    |

标志列中只会有 1 或 0。 我需要过滤结果,以便每个父/子组合只有一行。 如果在上面的完整结果集中有一个或多个记录,其中父/子组合为 1,则标志应为 1,否则应为零。

因此,如果应用于上述结果将是:

| ParentID | ChildID | Flag |
| 100      | 1       | 1    |
| 100      | 2       | 0    |
| 200      | 1       | 1    |

我只处理 ChildID 和 Flag 列:

DECLARE @InMemoryResultsFirstPass AS TABLE (ChildID Integer,Flag Integer)
DECLARE @InMemoryResultsRecs AS TABLE (ChildID Integer,Flag Integer)

INSERT INTO @InMemoryResultsFirstPass
      SELECT 1 ChildID,0 Flag
UNION SELECT 1 ChildID,1 Flag
UNION SELECT 2 ChildID,0 Flag
UNION SELECT 2 ChildID,1 Flag
UNION SELECT 1 ChildID,1 Flag

select * from @InMemoryResultsFirstPass

INSERT INTO @InMemoryResultsRecs
SELECT disTINCT 
    result.* 
FROM @InMemoryResultsFirstPass imr
    CROSS APPLY (
        SELECT TOP 1
            *
        FROM @InMemoryResultsFirstPass imrfp
        WHERE imrfp.ChildID = imr.ChildID
        ORDER BY imrfp.Flag DESC
    ) result

select * from @InMemoryResultsRecs

但是一旦我将它添加到 ParentID 列中,我就无法弄清楚如何执行此操作。我尝试了几种不同的方法,尝试在 CROSS APPLY 中使用 ParentID 上的 GROUP BY 进行嵌套查询,但无论我尝试什么,我都会丢失 ParentID = 200 条记录:

DECLARE @InMemoryResultsFirstPass AS TABLE (ParentID Integer,ChildID Integer,Flag Integer)
DECLARE @InMemoryResultsRecs AS TABLE (ParentID Integer,Flag Integer)

INSERT INTO @InMemoryResultsFirstPass
      SELECT 100 ParentID,1 ChildID,0 Flag
UNION SELECT 100 ParentID,1 Flag
UNION SELECT 100 ParentID,2 ChildID,0 Flag
UNION SELECT 200 ParentID,1 Flag
UNION SELECT 200 ParentID,1 Flag

select * from @InMemoryResultsFirstPass

INSERT INTO @InMemoryResultsRecs
SELECT disTINCT 
    result.* 
FROM @InMemoryResultsFirstPass imr
    CROSS APPLY (
        SELECT TOP 1
            *
        FROM @InMemoryResultsFirstPass imrfp
        WHERE imrfp.ChildID = imr.ChildID
        ORDER BY imrfp.Flag DESC
    ) result

select * from @InMemoryResultsRecs

如有任何帮助,我们将不胜感激。

感谢您抽出宝贵时间。

解决方法

实际上,我刚刚解决了:

SELECT ParentID,ChildID,MAX(Flag) AS Flag
FROM @InMemoryResultsFirstPass
GROUP BY ParentID,ChildID
ORDER BY ParentID,ChildID

希望这对其他人有帮助:-)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。