SQL视图仅选择自引用链的最后一个

时间:2017-11-11 09:05:41

标签: sql sql-server

我有一个表存储指定用户权限的字符串。我有一个列previous,在同一个表中有一个FK到id,这样就可以链接到以前版本的权限。我想要做的是创建一个只显示该链的最后一个(最新的链)的视图。原始的没有任何先前的值集。表格看起来像这样:

+-------+-------+------+----------+---------+
| ID    | PERMS | USER | PREVIOUS | VERSION |
+-------+-------+------+----------+---------+
| GUID1 | set1  | John |          | 1       |
| GUID2 | set2  | Dave |          | 1       |
| GUID3 | set3  | John | GUID1    | 2       |
| GUID4 | set4  | Phil |          | 1       |
| GUID5 | set5  | John | GUID3    | 3       |
| GUID6 | set6  | Dave | GUID2    | 2       |

依旧......

我想从视图中得到的只是John的set5,Dave的set6和Phil的set4。谷歌搜索并没有带来任何有用的东西,令人惊讶......

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

您可以按版本字段

执行此操作
select * 
  from table as T
 where version = 
       ( select max(version)
           from table 
          where User = T.User )

答案 1 :(得分:0)

你可以试试这个:

SELECT ID,PERMS,USERS,PREVIOUS,VERSION
          FROM 
          (select ID,PERMS,USERS,PREVIOUS,VERSION,
          ROW_NUMBER() OVER (PARTITION BY  USERS ORDER BY VERSION DESC) rn
          from Tab) A where rn=1

答案 2 :(得分:0)

这很有用。它基本上将用户所属的权限分组,对每行进行编号,然后仅选择rk = 1的权限。

WITH summary AS (
    SELECT p.id, 
        p.perms,
        p.user,
        p.previous,
        ROW_NUMBER() OVER(PARTITION BY p.user 
            ORDER BY p.version DESC) AS rk
FROM dbo.permissions p)
SELECT s.id, 
    s.user,
    s.perms,
    s.previous
    FROM summary s
    WHERE s.rk = 1

代码来自https://stackoverflow.com/a/3800572/6241823