Как заставить SQL Server Group By соблюдать порядок столбцов при группировке? - PullRequest
2 голосов
/ 05 октября 2010

Я использую SQL Server 2005.

СМ. КОНЕЦ ЭТОГО ПОЧТЫ ОТНОСИТЕЛЬНО ДЕРЖАТЕЛЯ ПЛОХОГО СТОЛА.

У меня есть две колонки. Я хотел бы сгруппировать по первому столбцу по порядку второго столбца. В документации Microsoft говорится, что предложение GROUP BY не заботится о порядке, как я могу применить это ??

Вот мой псевдопросмотр:

SELECT col_1,
       MIN(col_2),
       MAX(col_2)
FROM someTable
GROUP BY col_1 (*** WITH RESPECT TO ORDER OF col_2***)

Если я выполнил запрос в следующей таблице:

Col_1    Col_2
A       1
A       2
A       3
B       4
C       5
C       6
B       7
A       9

Я должен получить следующие результаты:

Col_1  Min   Max
A      1     3
B      4     4
C      5     6
B      7     7
A      9     9

Ключевым моментом является то, что я НЕ МОГУ иметь все 4 записи A, собранные вместе в наборе результатов. Когда запрашивается таблица / подзапрос, она сортируется по col_2, каждый новый экземпляр col_1 должен приводить к новой группировке. Спасибо, я не смог ничего найти по этому поводу.

Я могу сделать НИЧЕГО с дизайном стола. Это была таблица, созданная сторонним поставщиком, которая используется с их проприетарным программным обеспечением. Повторяю, я ничего не могу поделать с дизайном стола !!!!

Ответы [ 3 ]

8 голосов
/ 06 октября 2010
;WITH T
     AS (SELECT Col1,
                Col2,
                DENSE_RANK() OVER (ORDER BY Col2) - 
                   DENSE_RANK() OVER (PARTITION BY Col1 ORDER BY Col2) AS G
         FROM   YourTable)
SELECT Col1,
       MIN(Col2) AS [Min],
       Max(Col2) AS [Max]
FROM   T
GROUP  BY Col1,
          G
ORDER  BY [Min] 
2 голосов
/ 05 октября 2010

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

Если элементы должны быть сгруппированы в серии, вам необходимо поле, чтобы указать, что эти записи являются частью одной группы.Затем вы можете группировать по col_1 и seried_id.

Как вы будете определять во время вставки, к какой серии относится строка, является вашей проблемой и будет зависеть от ваших бизнес-правил.Вы никогда не можете полагаться на то, что данные хранятся последовательно, поэтому вам нужно исправить этот процесс, прежде чем идти дальше, иначе ваши данные НИКОГДА не дадут вам правильных результатов.

Лично Если бы у меня была группа записей, которые я хотел сохранить вместе, и я вставлял их одновременно, я вставлял бы их, используя сохраненный процесс с табличной переменной, чтобы я мог вставить set toegther и назначитьидентификатор серии в то время.Если они не все сделаны одновременно, вам нужно будет проверить последнюю вставленную запись, чтобы определить серийный идентификатор, который является проблематичным из-за условий гонки (вам также придется учитывать условия гонки, если они все вставлены вместе, они простос ним сложнее бороться).

Более подробная информация о том, что это за данные, поможет нам узнать, как вам помочь. Общая информация col_1, col_2 на данный момент бесполезна.Знание того, что это за данные, может помочь нам понять, почему у вас есть требование и как предложить способы обработки данных этого типа.

0 голосов
/ 05 октября 2010

Я воссоздал вашу таблицу и запрос и получил обратно:

col1    (No column name)    (No column name)
A   1   9
B   4   7
C   5   6

Я заметил, что ваш запрос, хотя и имел дополнительную запятую после части MAX (col2), заставляет меня поверить, что в настоящее время существуетпо крайней мере, еще один столбец в вашем «реальном» запросе, который приводит к результатам, которые вы поставили в вопросе.Я думаю, что мне нужна дополнительная информация, чтобы иметь дополнительную помощь.

DECLARE @SomeTable TABLE (Col1 CHAR(1), Col2 INT)

INSERT INTO @SomeTable(Col1, Col2) VALUES('A', 1)
INSERT INTO @SomeTable(Col1, Col2) VALUES('A', 2)
INSERT INTO @SomeTable(Col1, Col2) VALUES('A', 3)
INSERT INTO @SomeTable(Col1, Col2) VALUES('B', 4)
INSERT INTO @SomeTable(Col1, Col2) VALUES('C', 5)
INSERT INTO @SomeTable(Col1, Col2) VALUES('C', 6)
INSERT INTO @SomeTable(Col1, Col2) VALUES('B', 7)
INSERT INTO @SomeTable(Col1, Col2) VALUES('A', 9)

SELECT col1, 
       MIN(col2), 
       MAX(col2)
FROM @SomeTable 
GROUP BY col1
...