[英]Get every other row in SQL Server without using ROW_NUMBER(): Or… How is my row_number() wrong?
我的公司使用GoldMine CRM (在SQL服務器上),我正在編寫查詢以查找重復記錄。 查詢很棒,但它為每個重復返回兩行,我只需要一個。 但是,我似乎根本無法使用Row_Number()
- 它總是返回一個空白列。 這是我的查詢:
SELECT *
FROM (
SELECT
c11.company AS Company1,
c12.company AS Company2,
c11.phone1 AS DuplicatePhone,
c11.address1 AS C1Address1,
c12.address1 AS C2Address1,
c11.zip AS Zip1,
c12.zip AS Zip2,
c11.contact AS Contact_1,
c12.contact AS Contact_2,
SUBSTRING(c11.company, 1, CHARINDEX(' ', c11.company)) AS C1_Firstword,
SUBSTRING(c12.company, 1, CHARINDEX(' ', c12.company)) AS C2_Firstword,
c11.accountno AS Acctno1,
c12.accountno AS Acctno2
FROM db.contact1 AS c11
INNER JOIN db.contact1 AS c12
ON c11.phone1 = c12.phone1
WHERE c11.state = 'MA'
AND c12.state = 'MA'
AND c11.phone1 IS NOT NULL
AND c11.phone1 <> ''
AND c11.accountno <> c12.accountno) AS foo
WHERE (PATINDEX('%' + foo.C1_Firstword + '%', foo.company2) > 0
OR PATINDEX('%' + foo.C2_Firstword + '%', foo.company1) > 0)
ORDER BY foo.DuplicatePhone
該查詢首先查找具有相同電話號碼的記錄,然后查找公司名稱中的相似之處(有時我們的聯系人共享一個電話號碼而不會重復,但通常會找到一個名稱為“John Smith Enterprises”且其他“史密斯企業”)
我已經在這個查詢和一個更簡單的查詢中嘗試了 ROW_NUMBER() 的每次迭代,例如:
SELECT c1.accountno, c1.company, ROW_NUMBER() OVER(ORDER BY c1.Accountno ASC) row_num
FROM bpmain1.dbo.contact1 c1
WHERE c1.state = 'MA'
...而且我總是得到一個空白列。 我的理論是GoldMine中的SQL面板阻止我使用它,因為我從GoldMine返回的結果總是包含一個編號為“Row”的列(好像GoldMine “方便地”用空ROW_NUMBER()
條款。)
因此,對於每個重復的實例,我最終會得到兩行,而我只需要一個 - 哪一個都沒有關系。 使用ROW_NUMBER()
的目的是讓我得到其他所有結果。 還有其他想法嗎?
只需更改您的where
條件:
FROM db.contact1 c11 INNER JOIN
db.contact1 c12
ON c11.phone1 = c12.phone1 AND c11.state = c12.state
WHERE c11.state = 'MA' AND
c11.phone1 <> '' AND
c11.accountno < c12.accountno
--------------------^ this is the key change
也就是說,您不需要刪除重復項。 只是不要首先通過按帳戶順序返回聯系人來生成它們。
請注意,條件c11.phone1 IS NOT NULL
是多余的。 JOIN
條件和<> ''
都過濾掉NULL
值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.