1

長さによる並べ替えは、WITH 句内では機能しません。

;WITH Invalids AS
(
    SELECT TOP 1 WITH TIES
        GroupNumber, 
        RTRIM(Address1) Address1, 
        RTRIM(Postcode) Postcode
    FROM dbo.LoadData WHERE GroupNumber NOT IN
    (
        '000','016','018','025','044','048','049','053','054','055','060','064','067','069','071','073'
    )
    ORDER BY ROW_NUMBER() OVER (PARTITION BY GroupNumber ORDER BY LEN(Address1) DESC, LEN(Postcode) DESC )
)
UPDATE dbo.LoadData
SET 
    Valid = 0, 
    Reason = Reason + 'Bad address; '
WHERE GroupNumber = 
(
    SELECT GroupNumber FROM Invalids WHERE LEN(Address1) = 0 OR LEN(Postcode) = 0
4

1 に答える 1

5

TOP... WITH TIESORDER BY句に一致する値を持つすべてのものを提供します。'ORDER BY' 句は GroupNumber で分割された単なる行番号であるため、少なくとも 1 つのレコードを持つすべての GroupNumber には、行番号 1 のレコードが 1 つ含まれます。したがって、GroupNumber ごとに 1 つのレコードが返されます。MSDN はまた、「レコードを関連付けて返される順序は任意です。ORDER BY はこの規則には影響しません」と述べています。

CTEの「ORDER BY」は次のようになるはずです。

ORDER BY GroupNumber, LEN(Address1) DESC, LEN(Postcode) DESC

その場合、最小の GroupNumber と最も長い Address1 の値、最も長い Postcode の値、および重複を取得します。

一方、 GroupNumberごとに最長の住所と郵便番号が必要な場合、既にそれを取得しているはずです。さらに詳しい情報を求めます。

于 2012-02-28T16:13:34.177 に答える