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;