首页 > 解决方案 > 如何在sql中将过滤器分配给行号()函数

问题描述

在城镇不是奥斯汀的每种情况下,我都试图在 name = system 之后仅提取单行。
如果 1001 有 8 行,第 4 行是系统,则输出应该只有 Name=Terry 和 Date Moved=7/4/2019 的行(下一个带有城镇 /= Austin 的条目)

Case    Name      Town            Date Moved         Row #(Not in table)
1001    Ted       Madisson         9/7/2018            1
1001    Joyal     Boston           10/4/2018           2
1001    Beatrice  Chicago          1/1/2019            3
1001    System    Chicago          1/5/2019            4
1001    John      Austin           4/11/2019           5
1001    Simon     Austin           6/11/2019           6
1001    Terry     Cleveland        7/4/2019            7
1001    Hawkins   Newyork          8/4/2019            8
1002    Devon     Boston           12/4/2018           1
1002    Joy       Austin           12/7/2018           2
1002    Rachael   Newyork          12/19/2018          3
1002    Bill      Chicago          1/4/2019            4
1002    System    Dallas           2/12/2019           5
1002    Phil      Austin           3/16/2019           6
1002    Dan       Seattle          5/18/2019           7
1002    Claire    Birmingham       7/7/2019            8

尝试使用行号函数而不在 ('Austin') 过滤器中的子查询

ROW_NUMBER() OVER(PARTITION BY Case ORDER BY Moved_date ASC) AS ROWNUM

请注意,有 > 10k 个案例。

标签: sqlsql-server

解决方案


你可以试试下面的脚本 -

WITH CTE AS
(
    SELECT [Case],[Name],Town,[Date Moved],
    ROW_NUMBER() OVER (PARTITION BY [Case] ORDER BY [Date Moved])  [Row #]
    FROM your_table
)


SELECT A.* 
FROM CTE A
INNER JOIN 
(
    SELECT C.[Case],C.Town,MAX(C.[Row #]) MRN
    FROM CTE C
    INNER JOIN 
    (
        SELECT *
        FROM CTE A  
        WHERE  A.Name = 'System'
    )D ON C.[Case] = D.[Case] AND C.[Row #] > D.[Row #]
    AND C.Town = 'Austin'
    GROUP BY C.[Case],C.Town
)B ON A.[Case] = B.[Case] AND A.[Row #] = B.MRN+1

输出是 -

Case    Name    Town        Date Moved  Row #
1001    Terry   Cleveland   7/4/2019    6
1002    Dan     Seattle     5/18/2019   7

推荐阅读