Как упорядочить по длине внутри предложения WITH SQL Server 2008? - PullRequest
1 голос
/ 28 февраля 2012

Порядок по длине не работает внутри предложения 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

1 Ответ

3 голосов
/ 28 февраля 2012

TOP... WITH TIES даст вам все, что соответствует значению в предложении ORDER BY. Поскольку ваше предложение «ORDER BY» - это просто номер строки, который разделен на GroupNumber, то каждый GroupNumber, имеющий хотя бы одну запись, будет иметь одну из этих записей с номером строки 1. Поэтому вы вернете 1 запись для каждого GroupNumber. MSDN также говорит: «Возвращенный порядок связывания записей является произвольным. ORDER BY не влияет на это правило».

Я предполагаю, что ваш 'ORDER BY' в CTE должен быть просто:

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

Если это так, то вы получите самое низкое значение GroupNumber и самое длинное значение для Address1, самое длинное значение для почтового индекса и любые дубликаты.

С другой стороны, если вы действительно хотите указать самый длинный адрес и почтовый индекс для каждые GroupNumber, то вы уже должны это получить, и я бы попросил дополнительную информацию.

...