Как добавить порядковый номер для групп в SQL-запросе без временных таблиц
Я создал сложный поисковый запрос в SQL 2008, который возвращает данные, отсортированные по группам, и сам запрос имеет функции подкачки и сортировки в нем, но вместо того, чтобы возвращать заданное количество записей на основе параметров подкачки, он должен возвращать заданное количество групп (поэтому количество записей будет отличаться).
в настоящее время я делаю это с помощью временных таблиц (первая временная таблица создает список групп, которые будут выбраны как часть поиска, а затем нумерует их... и второй запрос присоединяет эту таблицу к фактическому поиску... таким образом, он дважды запускает поисковый запрос).
то, что я ищу более эффективный способ сделать это, используя некоторые из новых функций в 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 без использования temp столы?
2 ответов
пример данных
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
без более подробной информации о таблицах, которые у вас есть, я бы сказал, Посмотрите в 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