ms sql:如何将 Dense_Rank 与分组依据结合使用
ms sql: How to use Dense_Rank in conjunction with a Group by
我试图找到一些具有共同 table 表达式的记录,并结合分组依据来查找特定 table 的 duplicateNo 和 subDuplicateNo。这一切都是关于从 table 中查找重复项并通知 duplicateNo 和 subDuplicateNo。
但我想知道 subDuplicateNo 总是 1。但是我怎样才能增加列 subDuplicateNo?到目前为止,我已经搜索了很多但没有成功:-(
我的代码如下:
WITH cte AS (
SELECT t.Upper_Fornavn_FirstPart, t.Upper_Efternavn, Upper_Adresse, t.Telefon, Upper_postnr, Count(*) AS occurences,
ROW_NUMBER() OVER (ORDER BY t.Upper_Fornavn_FirstPart, t.Upper_Efternavn, Upper_Adresse, t.Telefon, Upper_postnr) as dubletno, t.subdubletno
FROM (
SELECT V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, MA2.Upper_Adresse, Telefon, Upper_postnr,
DENSE_RANK() OVER (PARTITION BY V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, MA2.Upper_Adresse, Telefon, Upper_postnr ORDER BY V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, MA2.Upper_Adresse, Telefon, Upper_postnr) AS subdubletno
FROM Medlemsdata V2
LEFT OUTER JOIN Postnumre
RIGHT OUTER JOIN MedlemsAdresse MA2 ON Postnumre.Postnummer = MA2.Postnr ON V2.FK_AdrID = MA2.AdrID
WHERE V2.vennenr > 0 AND V2.Upper_Fornavn_FirstPart <> '' AND V2.Upper_Efternavn <> '' AND Upper_Adresse <> '' AND V2.Telefon <> '' AND Upper_postnr <> ''
) as t
GROUP BY t.Upper_Fornavn_FirstPart, Upper_Efternavn, Upper_Adresse, Telefon, Upper_postnr, t.subdubletno
HAVING Count(*) > 1
)
SELECT V1.Vennenr, V1.Upper_Fornavn_FirstPart, V1.Upper_Efternavn, MA1.Upper_Adresse, V1.Telefon, MA1.Upper_postnr, cte.dubletno, cte.subdubletno
FROM
Medlemsdata V1
LEFT OUTER JOIN Postnumre
RIGHT OUTER JOIN MedlemsAdresse MA1 ON Postnumre.Postnummer = MA1.Postnr ON V1.FK_AdrID = MA1.AdrID
INNER JOIN cte ON
cte.Upper_Fornavn_FirstPart = V1.Upper_Fornavn_FirstPart AND
cte.Upper_Efternavn = v1.Upper_Efternavn AND
cte.Upper_Adresse = MA1.Upper_Adresse AND
cte.Upper_postnr = MA1.Upper_postnr AND
cte.Telefon = V1.Telefon
WHERE V1.vennenr > 0 and cte.occurences > 1
实际和预期数据如下:
Actual result:
ID Upper_Fornavn_FirstPart UPPER_EFTERNAVN UPPER_ADRESSE TELEFON UPPER_POSTNR DubletNo SubDubletNo
===============================================================================================================
1 ANNE JENSEN BIRKEHAVEN 2 12345678 7100 1 1
2 ANNE JENSEN BIRKEHAVEN 2 12345678 7100 1 1
3 TOM HANSEN SLOTSGADE 1 98765432 6000 2 1
4 TOM HANSEN SLOTSGADE 1 98765432 6000 2 1
---------------------------------------------------------------------------------------------------------------
Expected result:
ID Upper_Fornavn_FirstPart UPPER_EFTERNAVN UPPER_ADRESSE TELEFON UPPER_POSTNR DubletNo SubDubletNo
===============================================================================================================
1 ANNE JENSEN BIRKEHAVEN 2 12345678 7100 1 1
2 ANNE JENSEN BIRKEHAVEN 2 12345678 7100 1 2
3 TOM HANSEN SLOTSGADE 1 98765432 6000 2 1
4 TOM HANSEN SLOTSGADE 1 98765432 6000 2 2
在此先感谢您的任何帮助。
我真的希望这在技术上可以做到...
问候
迈克尔
更新:
我尝试了以下代码 - 但现在它在 duplicateNo 和 subDuplicateNo 的所有记录中都给了我 1 :-(
WITH cte AS (
SELECT t.Upper_Fornavn_FirstPart, t.Upper_Efternavn, Upper_Adresse, t.Telefon, Upper_postnr, t.dubletno, t.subdubletno
FROM (
SELECT V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, MA2.Upper_Adresse, Telefon, Upper_postnr,
COUNT(*) OVER (PARTITION BY V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, Upper_Adresse, v2.Telefon, Upper_postnr) as occurences,
DENSE_RANK() OVER (PARTITION BY V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, MA2.Upper_Adresse, Telefon, Upper_postnr ORDER BY Upper_postnr) AS dubletno,
ROW_NUMBER() OVER (PARTITION BY V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, MA2.Upper_Adresse, Telefon, Upper_postnr ORDER BY Upper_postnr) AS subdubletno
FROM Medlemsdata V2
LEFT OUTER JOIN Postnumre
RIGHT OUTER JOIN MedlemsAdresse MA2 ON Postnumre.Postnummer = MA2.Postnr ON V2.FK_AdrID = MA2.AdrID
WHERE V2.vennenr > 0 AND V2.Upper_Fornavn_FirstPart <> '' AND V2.Upper_Efternavn <> '' AND Upper_Adresse <> '' AND V2.Telefon <> '' AND Upper_postnr <> ''
GROUP BY Upper_Fornavn_FirstPart, Upper_Efternavn, Upper_Adresse, Telefon, Upper_postnr
HAVING Count(*) > 1
) as t
)
SELECT V1.Vennenr, V1.Upper_Fornavn_FirstPart, V1.Upper_Efternavn, MA1.Upper_Adresse, V1.Telefon, MA1.Upper_postnr, cte.dubletno, cte.subdubletno
FROM
Medlemsdata V1
LEFT OUTER JOIN Postnumre
RIGHT OUTER JOIN MedlemsAdresse MA1 ON Postnumre.Postnummer = MA1.Postnr ON V1.FK_AdrID = MA1.AdrID
INNER JOIN cte ON
cte.Upper_Fornavn_FirstPart = V1.Upper_Fornavn_FirstPart AND
cte.Upper_Efternavn = v1.Upper_Efternavn AND
cte.Upper_Adresse = MA1.Upper_Adresse AND
cte.Upper_postnr = MA1.Upper_postnr AND
cte.Telefon = V1.Telefon
WHERE V1.vennenr > 0
这个查询似乎做了很多额外的工作。我还怀疑您的右连接构造可以简化。
SELECT t.*
FROM (
SELECT V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, V2.Upper_Adresse, Telefon, Upper_postnr,
COUNT(*) OVER (PARTITION BY V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, V2.Upper_Adresse, Telefon, Upper_postnr) as occurences,
DENSE_RANK() OVER (ORDER BY V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, V2.Upper_Adresse, Telefon, Upper_postnr) as dubletno,
ROW_NUMBER() OVER (PARTITION BY V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, V2.Upper_Adresse, Telefon, Upper_postnr ORDER BY Upper_postnr) AS subdubletno
FROM data V2
WHERE V2.vennenr > 0 AND V2.Upper_Fornavn_FirstPart <> '' AND V2.Upper_Efternavn <> '' AND Upper_Adresse <> '' AND V2.Telefon <> '' AND Upper_postnr <> ''
) as t
WHERE t.occurences > 0;
我试图找到一些具有共同 table 表达式的记录,并结合分组依据来查找特定 table 的 duplicateNo 和 subDuplicateNo。这一切都是关于从 table 中查找重复项并通知 duplicateNo 和 subDuplicateNo。 但我想知道 subDuplicateNo 总是 1。但是我怎样才能增加列 subDuplicateNo?到目前为止,我已经搜索了很多但没有成功:-(
我的代码如下:
WITH cte AS (
SELECT t.Upper_Fornavn_FirstPart, t.Upper_Efternavn, Upper_Adresse, t.Telefon, Upper_postnr, Count(*) AS occurences,
ROW_NUMBER() OVER (ORDER BY t.Upper_Fornavn_FirstPart, t.Upper_Efternavn, Upper_Adresse, t.Telefon, Upper_postnr) as dubletno, t.subdubletno
FROM (
SELECT V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, MA2.Upper_Adresse, Telefon, Upper_postnr,
DENSE_RANK() OVER (PARTITION BY V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, MA2.Upper_Adresse, Telefon, Upper_postnr ORDER BY V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, MA2.Upper_Adresse, Telefon, Upper_postnr) AS subdubletno
FROM Medlemsdata V2
LEFT OUTER JOIN Postnumre
RIGHT OUTER JOIN MedlemsAdresse MA2 ON Postnumre.Postnummer = MA2.Postnr ON V2.FK_AdrID = MA2.AdrID
WHERE V2.vennenr > 0 AND V2.Upper_Fornavn_FirstPart <> '' AND V2.Upper_Efternavn <> '' AND Upper_Adresse <> '' AND V2.Telefon <> '' AND Upper_postnr <> ''
) as t
GROUP BY t.Upper_Fornavn_FirstPart, Upper_Efternavn, Upper_Adresse, Telefon, Upper_postnr, t.subdubletno
HAVING Count(*) > 1
)
SELECT V1.Vennenr, V1.Upper_Fornavn_FirstPart, V1.Upper_Efternavn, MA1.Upper_Adresse, V1.Telefon, MA1.Upper_postnr, cte.dubletno, cte.subdubletno
FROM
Medlemsdata V1
LEFT OUTER JOIN Postnumre
RIGHT OUTER JOIN MedlemsAdresse MA1 ON Postnumre.Postnummer = MA1.Postnr ON V1.FK_AdrID = MA1.AdrID
INNER JOIN cte ON
cte.Upper_Fornavn_FirstPart = V1.Upper_Fornavn_FirstPart AND
cte.Upper_Efternavn = v1.Upper_Efternavn AND
cte.Upper_Adresse = MA1.Upper_Adresse AND
cte.Upper_postnr = MA1.Upper_postnr AND
cte.Telefon = V1.Telefon
WHERE V1.vennenr > 0 and cte.occurences > 1
实际和预期数据如下:
Actual result:
ID Upper_Fornavn_FirstPart UPPER_EFTERNAVN UPPER_ADRESSE TELEFON UPPER_POSTNR DubletNo SubDubletNo
===============================================================================================================
1 ANNE JENSEN BIRKEHAVEN 2 12345678 7100 1 1
2 ANNE JENSEN BIRKEHAVEN 2 12345678 7100 1 1
3 TOM HANSEN SLOTSGADE 1 98765432 6000 2 1
4 TOM HANSEN SLOTSGADE 1 98765432 6000 2 1
---------------------------------------------------------------------------------------------------------------
Expected result:
ID Upper_Fornavn_FirstPart UPPER_EFTERNAVN UPPER_ADRESSE TELEFON UPPER_POSTNR DubletNo SubDubletNo
===============================================================================================================
1 ANNE JENSEN BIRKEHAVEN 2 12345678 7100 1 1
2 ANNE JENSEN BIRKEHAVEN 2 12345678 7100 1 2
3 TOM HANSEN SLOTSGADE 1 98765432 6000 2 1
4 TOM HANSEN SLOTSGADE 1 98765432 6000 2 2
在此先感谢您的任何帮助。
我真的希望这在技术上可以做到...
问候
迈克尔
更新: 我尝试了以下代码 - 但现在它在 duplicateNo 和 subDuplicateNo 的所有记录中都给了我 1 :-(
WITH cte AS (
SELECT t.Upper_Fornavn_FirstPart, t.Upper_Efternavn, Upper_Adresse, t.Telefon, Upper_postnr, t.dubletno, t.subdubletno
FROM (
SELECT V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, MA2.Upper_Adresse, Telefon, Upper_postnr,
COUNT(*) OVER (PARTITION BY V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, Upper_Adresse, v2.Telefon, Upper_postnr) as occurences,
DENSE_RANK() OVER (PARTITION BY V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, MA2.Upper_Adresse, Telefon, Upper_postnr ORDER BY Upper_postnr) AS dubletno,
ROW_NUMBER() OVER (PARTITION BY V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, MA2.Upper_Adresse, Telefon, Upper_postnr ORDER BY Upper_postnr) AS subdubletno
FROM Medlemsdata V2
LEFT OUTER JOIN Postnumre
RIGHT OUTER JOIN MedlemsAdresse MA2 ON Postnumre.Postnummer = MA2.Postnr ON V2.FK_AdrID = MA2.AdrID
WHERE V2.vennenr > 0 AND V2.Upper_Fornavn_FirstPart <> '' AND V2.Upper_Efternavn <> '' AND Upper_Adresse <> '' AND V2.Telefon <> '' AND Upper_postnr <> ''
GROUP BY Upper_Fornavn_FirstPart, Upper_Efternavn, Upper_Adresse, Telefon, Upper_postnr
HAVING Count(*) > 1
) as t
)
SELECT V1.Vennenr, V1.Upper_Fornavn_FirstPart, V1.Upper_Efternavn, MA1.Upper_Adresse, V1.Telefon, MA1.Upper_postnr, cte.dubletno, cte.subdubletno
FROM
Medlemsdata V1
LEFT OUTER JOIN Postnumre
RIGHT OUTER JOIN MedlemsAdresse MA1 ON Postnumre.Postnummer = MA1.Postnr ON V1.FK_AdrID = MA1.AdrID
INNER JOIN cte ON
cte.Upper_Fornavn_FirstPart = V1.Upper_Fornavn_FirstPart AND
cte.Upper_Efternavn = v1.Upper_Efternavn AND
cte.Upper_Adresse = MA1.Upper_Adresse AND
cte.Upper_postnr = MA1.Upper_postnr AND
cte.Telefon = V1.Telefon
WHERE V1.vennenr > 0
这个查询似乎做了很多额外的工作。我还怀疑您的右连接构造可以简化。
SELECT t.*
FROM (
SELECT V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, V2.Upper_Adresse, Telefon, Upper_postnr,
COUNT(*) OVER (PARTITION BY V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, V2.Upper_Adresse, Telefon, Upper_postnr) as occurences,
DENSE_RANK() OVER (ORDER BY V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, V2.Upper_Adresse, Telefon, Upper_postnr) as dubletno,
ROW_NUMBER() OVER (PARTITION BY V2.Upper_Fornavn_FirstPart, V2.Upper_Efternavn, V2.Upper_Adresse, Telefon, Upper_postnr ORDER BY Upper_postnr) AS subdubletno
FROM data V2
WHERE V2.vennenr > 0 AND V2.Upper_Fornavn_FirstPart <> '' AND V2.Upper_Efternavn <> '' AND Upper_Adresse <> '' AND V2.Telefon <> '' AND Upper_postnr <> ''
) as t
WHERE t.occurences > 0;