【问题标题】:SQL: Help identifying patternsSQL:帮助识别模式
【发布时间】:2015-03-10 22:09:11
【问题描述】:

我有一个如下所示的表格:

我要做的是基于相同的 ResourceName 和 Permissions 合并组,并为它们提供相同的唯一标识符。但是,我有多个 ResourceNames 重复自己的组,并且不能为同一组提供另一个唯一 ID。

例如,GroupAdmin 和 GroupUser1 将是一个具有 ID 的集合,而 GroupUser2 和 GroupUser3 将是另一个集合。我有数百万行这样的。

请帮我写一个查询或一些代码来解决这个问题。谢谢!!

编辑添加了没有图片的表格

ResourceName    Permissions        GroupName
Resource1           Modify             GroupAdmin
Resource1           Modify             GroupUser1
Resource1           Read & Execute         GroupUser2
Resource1           Read & Execute         GroupUser3
Resource2           Modify             GroupAdmin
Resource2           Modify             GroupUser1
Resource2           Read & Execute         GroupUser2
Resource2           Read & Execute         GroupUser3
Resource3           Modify             GroupAdmin
Resource3           Modify             GroupUser1
Resource3           Read & Execute         GroupUser2
Resource3           Read & Execute         GroupUser3
Resource4           Modify             GroupAdmin
Resource4           Modify             GroupUser1
Resource4           Read & Execute         GroupUser2
Resource4           Read & Execute         GroupUser3

【问题讨论】:

  • 您应该编辑您的问题并输入示例数据和所需的结果。我看不到您尝试添加的图片。

标签: sql sql-server tsql active-directory


【解决方案1】:
select r + '-' + p as id, r, p, g from rpg;

将以非常简单的方式为您提供一个 ID,基于相同的 ResourceName r 和 Permissions p。

或者你可以这样做:

select r, p, g, rank() over(order by r, p) as id from rpg;

【讨论】:

  • 不幸的是,我已经尝试过了,你是对的,它提供了一个不错的 ID 输出,但是一旦 ResourceName 发生更改,它就会为组提供一个新的 ID。我不能拥有一个 ID 超过 1 个的群组...
  • 那么您希望这是一个经常运行的程序吗?任务是使用 SQL 识别模式,这意味着在某个时间点获取信息和具有新 ID 的分组。我建议创建一个新表,为 ResourceName-Permission 对持久保存已经“生成”的 ID 并进行外部连接,仅以上述方式处理与此新表中的任何行不匹配 (NULL) 的行。
【解决方案2】:

建议,下次添加您想要的结果表格会有所帮助。话虽如此,我想我知道你想要什么了。

试试这个:

--Create A Simple Version of YourTable
SELECT * INTO YourTable
FROM
(
    SELECT 'Resource1' AS ResourceName, 'Modify' AS [Permissions], 'GroupAdmin' AS GroupName
    UNION ALL
    SELECT 'Resource1', 'Modify', 'GroupUser1'
    UNION ALL
    SELECT 'Resource1', 'Read & Execute', 'GroupUser2'
    UNION ALL
    SELECT 'Resource1', 'Read & Execute', 'GroupUser3'

) A


SELECT  A.ID,
        B.GroupName

FROM
(
    --Groups Resource and Permssion combinations and assigns ID using row_number()
    SELECT  ROW_NUMBER() OVER (ORDER BY ResourceName,[Permissions]) ID,
            ResourceName,[Permissions]
    FROM YourTable
    GROUP BY ResourceName,[Permissions]
) A
--Match up your GroupNames to your Resource/Permssion Pairs
INNER JOIN YourTable B
    ON A.ResourceName = B.ResourceName
    AND A.[Permissions] = B.[Permissions]

结果:

ID                   GroupName
-------------------- ----------
1                    GroupAdmin
1                    GroupUser1
2                    GroupUser2
2                    GroupUser3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-29
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 2015-05-02
    相关资源
    最近更新 更多