SQL пользовательский совокупный порядок значений сохраняется? - PullRequest
11 голосов
/ 06 июля 2011

Я использую код из этой страницы MSDN , чтобы создать пользовательский агрегат для объединения строк с group by's на SQL-сервере. Одно из моих требований состоит в том, что порядок объединенных значений такой же, как в запросе. Например:

Value   Group
1       1
2       1
3       2
4       2

Использование запроса

SELECT
  dbo.Concat(tbl.Value) As Concat,
  tbl.Group
FROM
  (SELECT TOP 1000
     tblTest.*
  FROM 
    tblTest
  ORDER BY 
    tblTest.Value) As tbl
GROUP BY
  tbl.Group

Результатом будет:

Concat  Group
"1,2"   1
"3,4"   2

Результат, кажется, всегда получается правильным и, как и ожидалось, но я наткнулся на на этой странице , в которой говорится, что порядок не гарантирован, а этот атрибут SqlUserDefinedAggregateAttribute.IsInvariantToOrder зарезервирован только для будущего использования.

Итак, мой вопрос: правильно ли предположить, что объединенные значения в строке могут оказаться в любом порядке?
Если это так, то почему код примера на странице MSDN использует атрибут IsInvariantToOrder?

Ответы [ 2 ]

5 голосов
/ 06 июля 2011

Я подозреваю, что большая проблема здесь в том, что вы говорите «так же, как в запросе» - однако ваш запрос никогда определяет (и не может определять) порядок по существующим вещам агрегированный (вы можете, конечно, заказать групп , имея ORDER BY после GROUP BY). Кроме того, я могу только сказать, что он основан исключительно на множестве (а не на упорядоченной последовательности) и что технически порядок действительно не определен.

0 голосов
/ 12 февраля 2014

Хотя принятый ответ правильный, я хотел бы поделиться обходным путем, который другие могут найти полезным. Предупреждение: это означает, что пользовательский агрегат вообще не используется:)

Ссылка ниже описывает элегантный способ построения составного списка с разделителями, используя только оператор SELECT и переменную varchar. Достоинством (для этой темы) является то, что вы можете указать порядок, в котором обрабатываются строки. Недостатком является то, что вы не можете легко объединить множество подмножеств строк без болезненной итерации.

Не идеально, но для моего случая использования это было хорошим решением.

http://blog.sqlauthority.com/2008/06/04/sql-server-create-a-comma-delimited-list-using-select-clause-from-table-column/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...