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



select查询需要显示除具有特定条件的列的第一条记录以外的所有记录

当前数据:

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的第一个Type=0,对于同一个CallID的Type=0的重置需要在最后的选择中忽略。

任何提示或想法都非常感谢。

您可以计算一个运行和,当重复的<Id,>是发现。然后您可以选择带有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)

点击这里查看演示。

注意:我猜">StartTime"与日期时间类型相关联。为了简单起见,在fiddle中显示为整数,也应该与datetime一起使用。

所以我没有想到直接方法,因此我遵循了Union

选择的第一个数据集类型!=0和第二组数据的类型=0与ROW_NUMBER() OVER(PARTITION BY Name, Type, ID ORDER BY StartTime),其中只提供类型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

相关内容

  • 没有找到相关文章

最新更新