Как добавить порядковый номер для групп в запросе SQL без временных таблиц - PullRequest
9 голосов
/ 10 марта 2011

Я создал сложный поисковый запрос в SQL 2008, который возвращает данные, отсортированные по группам, и сам запрос содержит функции подкачки и сортировки, но вместо того, чтобы возвращать заданное количество записей на основе параметров подкачки, ему нужнычтобы вернуть заданное количество групп (таким образом, количество записей будет варьироваться).

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

Что я ищуfor - более эффективный способ сделать это, используя некоторые из новых функций в SQL 2008 (которые не требуют использования временных таблиц).

Если я смогу получить данные в таком формате, как я, ябыло бы установлено ...

Record  Group     GroupSequence
-------|---------|--------------
1       Chickens  1
2       Chickens  1
3       Cows      2
4       Horses    3
5       Horses    3
6       Horses    3

Есть идеи, как выполнить это с помощью одного запроса в SQL 2008 без использования временных таблиц?

Ответы [ 2 ]

11 голосов
/ 10 марта 2011

Пример данных

create table sometable([group] varchar(10), id int, somedata int)
insert sometable select 'Horses', 9, 11
insert sometable select 'chickens', 19, 121
insert sometable select 'Horses', 29, 123
insert sometable select 'chickens', 49, 124
insert sometable select 'Cows', 98, 1
insert sometable select 'Horses', 99, 2

Запрос

select
    Record = ROW_NUMBER() over (order by [Group], id),
    [Group],
    GroupSequence = DENSE_RANK() over (order by [Group])
from sometable

Вывод

Record               Group      GroupSequence
-------------------- ---------- --------------------
1                    chickens   1
2                    chickens   1
3                    Cows       2
4                    Horses     3
5                    Horses     3
6                    Horses     3
1 голос
/ 10 марта 2011

Без дополнительной информации о таблицах, которые у вас есть, я бы сказал, посмотрите на CTE запросы и функцию row_number ... что-то вроде:

;with groups as (
  select top 10 name, row_number() over(order by name) 'sequence'
  from table1
  group by name
  order by name
)
select row_number() over(order by g.name) 'Record',
  g.name 'GroupName',
  g.sequence 'GroupSequence'
from groups
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...