2012-02-28 5 views
1

Порядок по длине не работает внутри предложения WITH.Как заказать по длине внутри предложения WITH SQL Server 2008?

;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 
+2

Это поможет понять вашу проблему, если вы предоставили некоторые примерные данные, фактический результат и ожидаемый результат. Я проверил ваш запрос и, как я вижу, ваш оператор 'order by' делает то, что он должен делать. Примечание: 'len' не считает конечные пробелы, поэтому это будет' 0', 'select len ​​('')'. –

ответ

3

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

Я собираюсь предположить, что ваш «ORDER BY» в КТР должно быть просто:

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

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

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

Смежные вопросы