left - sql on用法




SQL Left僅加入第一個匹配 (4)

distinct 不是一個功能。 它始終在選擇列表的所有列上運行。

您的問題是典型的“每組最大N”問題,可以使用窗口函數輕鬆解決:

select ...
from (
  select IDNo,
         FirstName,
         LastName,
         ....,
         row_number() over (partition by lower(idno) order by firstname) as rn 
  from people 
) t
where rn = 1;

使用order by子句,您可以選擇要選擇的重複項。

以上可用於左連接:

select ...
from x
  left join (
    select IDNo,
           FirstName,
           LastName,
           ....,
           row_number() over (partition by lower(idno) order by firstname) as rn 
    from people 
  ) p on p.idno = x=idno and p.rn = 1
where ...

我有一個針對大量連接的大表(行和列)的查詢,但是其中一個表有一些重複的數據行導致我的查詢出現問題。 由於這是來自其他部門的只讀實時訂閱源,因此我無法修復該數據,但我正在嘗試通過它來防止查詢中的問題。

鑑於此,我需要將此垃圾數據作為左連接添加到我的好查詢中。 數據集如下所示:

IDNo    FirstName   LastName    ...
-------------------------------------------
uqx     bob     smith
abc     john        willis
ABC     john        willis
aBc     john        willis
WTF     jeff        bridges
sss     bill        doe
ere     sally       abby
wtf     jeff        bridges
...

(約24列,100K行)

我的第一直覺是執行一個獨特的給了我大約80K行:

SELECT DISTINCT P.IDNo
FROM people P

但是,當我嘗試以下操作時,我會收到所有行:

SELECT DISTINCT P.*
FROM people P

要么

SELECT 
    DISTINCT(P.IDNo) AS IDNoUnq 
    ,P.FirstName
    ,P.LastName
    ...etc.    
FROM people P

然後我想我會在所有列上執行FIRST()聚合函數,但是這也感覺不對。 從語法上講,我在這裡做錯了嗎?

更新:只是想注意:這些記錄是基於上面列出的非密鑰/非索引的ID字段的重複記錄。 ID是文本字段,雖然具有相同的值,但它與導致該問題的其他數據的情況不同。


事實證明我做錯了,我需要首先執行重要列的嵌套選擇,並做一個明確的選擇,以防止垃圾列的“唯一”數據破壞我的好數據。 以下似乎解決了這個問題......但我稍後會嘗試完整的數據集。

SELECT DISTINCT P2.*
FROM (
  SELECT
      IDNo
    , FirstName
    , LastName
  FROM people P
) P2

以下是一些請求的播放數據: http://sqlfiddle.com/#!3/050e0d/3http://sqlfiddle.com/#!3/050e0d/3

CREATE TABLE people
(
       [entry] int
     , [IDNo] varchar(3)
     , [FirstName] varchar(5)
     , [LastName] varchar(7)
);

INSERT INTO people
    (entry,[IDNo], [FirstName], [LastName])
VALUES
    (1,'uqx', 'bob', 'smith'),
    (2,'abc', 'john', 'willis'),
    (3,'ABC', 'john', 'willis'),
    (4,'aBc', 'john', 'willis'),
    (5,'WTF', 'jeff', 'bridges'),
    (6,'Sss', 'bill', 'doe'),
    (7,'sSs', 'bill', 'doe'),
    (8,'ssS', 'bill', 'doe'),
    (9,'ere', 'sally', 'abby'),
    (10,'wtf', 'jeff', 'bridges')
;

嘗試這個

 SELECT *
 FROM people P 
 where P.IDNo in (SELECT DISTINCT IDNo
              FROM people)

根據重複行的性質,看起來您想要的只是對這些列具有區分大小寫。 在這些列上設置排序規則應該是您所追求的:

SELECT DISTINCT p.IDNO COLLATE SQL_Latin1_General_CP1_CI_AS, p.FirstName COLLATE SQL_Latin1_General_CP1_CI_AS, p.LastName COLLATE SQL_Latin1_General_CP1_CI_AS
FROM people P

http://msdn.microsoft.com/en-us/library/ms184391.aspx







greatest-n-per-group