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