如何忽略列中不包含数据的重复行

如何忽略列中不包含数据的重复行

问题描述:

我有一个包含重复行的表,但是某些重复行具有的列不包含同一列的数据。我怎样才能删除/只忽略那些列空白的行?在某些情况下:如何忽略列中不包含数据的重复行

Name  Employee# Location City 
----------------------------------------- 
BowerT  48999  NJ Foods 
BowerT  48999  NJ Foods Pearl 
BowerT  48999  NJ Foods Johns 
BowerT  48999  NJ Foods Johns 

我使用的是CTE删除重复,但是,如果第二,第三或第四行有我需要该列的数据,我失去了它,因为它们比列1时。

;With hrEmployee as 
(
    Select 
     *, 
     Row_Number() Over (Partition BY Employee_Number order by Employee_Number) As RowNumber 
    From 
     [dbo].[hrEmployee] 
    Where 
     Employee_Number = '48999'  
) 
Delete hrEmployees 
where RowNumber > 1 

我在想什么?

+0

你确定你可以在MySQL中使用'WITH'吗? – Mojtaba

+0

为什么不使用** where **条件检查空白的特定列? – blackpen

+0

[mysql]标记在这里不正确。这看起来像sql-server。 –

这里是整个例子的相关代码的变化是:

ROW_NUMBER() OVER (PARTITION BY Employee_Number ORDER BY 
      CASE WHEN ISNULL(City,'') = '' THEN 1 ELSE 0 END 
     ) as RowNumber 

什么,做仅仅是为了你的,你要保留,说什么如果纽约市为空或“”的结果(空白)使它最后。您可以通过在您的ORDER BY中指定不同顺序来排序您的结果。

DECLARE @Table AS TABLE (Name VARCHAR(10), Employee_Number INT, Location VARCHAR(20), City VARCHAR(20)) 
INSERT INTO @Table VALUES ('BowerT',48999,'NJ Foods',NULL) 
,('BowerT',48999,'NJ Foods','Pearl') 
,('BowerT',48999,'NJ Foods','Johns') 
,('BowerT',48999,'NJ Foods','Johns') 

SELECT * 
FROM 
    @Table 

;WITH hrEmployee AS (
     SELECT 
      * 
      ,ROW_NUMBER() OVER (PARTITION BY Employee_Number ORDER BY 
       CASE WHEN ISNULL(City,'') = '' THEN 1 ELSE 0 END 
      ) as RowNumber 
     FROM 
      @Table 
     where Employee_Number = '48999' 
) 

DELETE 
FROM 
    hrEmployee 
WHERE 
    RowNumber > 1 

SELECT * 
FROM 
    @Table 
+1

谢谢,是的,这是完美的。这正是我需要的。非常感谢你!!! – user1964673