SQL Server中基于ROW_NUMBER的列的特定条件

k5ifujac  于 2023-01-12  发布在  SQL Server
关注(0)|答案(2)|浏览(222)

选择查询需要显示除具有特定条件的列的第一条记录之外的所有记录
当前数据:

ID  Type    Name
123 0   Sathiya
123 1   Kumar
123 NULL    Mohan
123 6   Ranjith
124 0   Sathiya
123 0   John
125 6   Albert
123 0   Sathiya
124 0   Kumar
124 0   Joseph

预期数据:

ID  Type    Name
123 0   Sathiya
123 1   Kumar
123 NULL    Mohan
123 6   Ranjith
124 0   Sathiya
125 6   Albert

使用的查询:

SELECT
ROW_NUMBER() PARTITION BY ID,Type ORDER BY StartTime ASC AS RN,
*
INTO #temp1
FROM TABLE

SELECT 
*
FROM #temp1
WHERE RN>1

但是这个查询将不足以提供所需的数据,因为RN将针对所有类型被划分,但是我需要仅针对相同CallID的类型0获得RN。除了相同CallID的第一类型=0之外,在最终选择中需要忽略相同CallID的类型=0的重置。
任何线索或想法都非常感谢。

xtupzzrd

xtupzzrd1#

当发现重复的〈Id,Type,Name〉时,可以计算一个递增的运行总和,然后可以选择第一个分区TOP 1 WITH TIES

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY Name, Type, ID ORDER BY StartTime)-1 AS rn 
    FROM tab
)
SELECT TOP 1 WITH TIES Id, Type, Name 
  FROM cte
ORDER BY SUM(rn) OVER(ORDER BY StartTime)

检查here演示。
注意:我猜“StartTime”是和日期时间类型相关的。为了简单起见,在小提琴上显示为整数,应该也可以和日期时间一起使用。

7gs2gvoe

7gs2gvoe2#

所以我没有想到用直接方法来做,所以我遵循了Union
选择Type!=0的第一组数据和Type=0的第二组数据,ROW_NUMBER() OVER(PARTITION BY Name, Type, ID ORDER BY StartTime)仅为Type 0提供1、2、3。然后输入RN=1,得到预期结果。

SELECT
*
INTO #tempTypeNo0
FROM TABLE
WHERE Type!=0

SELECT
ROW_NUMBER() PARTITION BY ID,Type ORDER BY StartTime ASC AS RN,
*
INTO #tempType0
FROM TABLE
WHERE Type=0

SELECT *
FROM
(
SELECT ID,Type,Name FROM tempTypeNo0
UNION
SELECT ID,Type,Name FROM tempType0 WHERE RN=1

)a

相关问题