如何在 WITH 子句 SQL Server 2008 中按长度排序?

Gan*_*sun 1 t-sql row-number sql-server-2008

按长度排序在 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
Run Code Online (Sandbox Code Playgroud)

Jer*_*ore 5

TOP... WITH TIES将为您提供在ORDER BY子句中具有匹配值的所有内容。因为您的“ORDER BY”子句只是一个由 GroupNumber 分区的行号,所以每个至少有一个记录的 GroupNumber 都会有一个行号为 1 的记录。因此,您将为每个 GroupNumber 返回 1 个记录。MSDN 还说“绑定记录的返回顺序是任意的。ORDER BY 不影响此规则。”

我猜你在 CTE 中的“ORDER BY”应该是:

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

如果是这样,那么您将获得最低的 GroupNumber、最长的 Address1 值、最长的 Postcode 值以及任何重复项。

另一方面,如果您确实想要每个GroupNumber的最长地址和邮政编码,那么您应该已经知道了,我会要求提供更多信息。