Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 n последних записей по каждой группе  [new]
mr.vetal
Member

Откуда:
Сообщений: 373
Есть таблица сущностей, и таблица групп сущностей

как вывести n последних записей в таблице сущностей не составляет труда (TOP)
Вопрос:
Как вывести список сущностей, чтоб в нем было по n последних записей из каждой группы?

С ув. Виталий
4 июн 09, 15:40    [7265871]     Ответить | Цитировать Сообщить модератору
 Re: n последних записей по каждой группе  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
mr.vetal
как вывести n последних записей в таблице сущностей не составляет труда (TOP)
Чем же определяется, что это n последних записей, а не первых или случайных записей?
Версия сервера - ???
4 июн 09, 15:54    [7265965]     Ответить | Цитировать Сообщить модератору
 Re: n последних записей по каждой группе  [new]
mr.vetal
Member

Откуда:
Сообщений: 373
последних: я сортирую по полю "дата" с помощью DESC и выбираю 3 первых записи с помощью TOP

С ув. Виталий
4 июн 09, 16:12    [7266085]     Ответить | Цитировать Сообщить модератору
 Re: n последних записей по каждой группе  [new]
mr.vetal
Member

Откуда:
Сообщений: 373
поправка N первых записей =)

С ув. Виталий
4 июн 09, 16:12    [7266089]     Ответить | Цитировать Сообщить модератору
 Re: n последних записей по каждой группе  [new]
mr.vetal
Member

Откуда:
Сообщений: 373
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)

С ув. Виталий
4 июн 09, 16:17    [7266119]     Ответить | Цитировать Сообщить модератору
 Re: n последних записей по каждой группе  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Расскажите теперь, как называется таблица, её поля, что определяет группу записей и т.д.
Короче, показывайте скрипт создания таблицы (CREATE TABLE).
Не клещами же из Вас информацию вытягивать?!
4 июн 09, 16:29    [7266191]     Ответить | Цитировать Сообщить модератору
 Re: n последних записей по каждой группе  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2791
set nocount on
declare @a table(n int, m int)
insert  @a values(1,1)
insert  @a values(1,2)
insert  @a values(1,3)
insert  @a values(1,4)
insert  @a values(2,10)
insert  @a values(2,40)
insert  @a values(3,100)
insert  @a values(3,200)
insert  @a values(3,400)
insert  @a values(4,1000)

select
  n,m
from
 (
  select
    r = row_number() over(partition by n order by m desc),
    n,
    m
  from
    @a
  ) t
where
  r <= 2
order by
  n,m
Это по 2 последних записи в группе. Для 2х первых - уберите desc.
4 июн 09, 16:42    [7266288]     Ответить | Цитировать Сообщить модератору
 Re: n последних записей по каждой группе  [new]
mr.vetal
Member

Откуда:
Сообщений: 373
документы:
CREATE TABLE [dbo].[documents](
	[document_id] [int] IDENTITY(1,1) NOT NULL,
	[document_number] [nchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[document_date] [datetime] NULL,
	[klient_id] [int] NULL
) ON [PRIMARY]

клиенты:
CREATE TABLE [dbo].[Klient](
	[klient_id] [int] NULL,
	[klient_name] [nchar](40) COLLATE Cyrillic_General_CI_AS NULL
) ON [PRIMARY]

нужно получить список
клиент, документ, дата документа
в котором будет N последних документов по каждому клиенту

С ув. Виталий
4 июн 09, 16:44    [7266303]     Ответить | Цитировать Сообщить модератору
 Re: n последних записей по каждой группе  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
1
DECLARE @N INT;
SET @N=10;
WITH CTE AS
(
 SELECT
  ROW_NUMBER()OVER(PARTITION BY d.[klient_id] ORDER BY d.[document_date] DESC) N,
  d.[klient_id]
  K.klient_name,
  d.document_number,
  d.document_date
 FROM [dbo].[documents] d JOIN [dbo].[Klient] K ON d.[klient_id]=K.klient_id
)
SELECT 
  klient_name,
  document_number,
  document_date
FROM CTE
WHERE N<=@N;
2
DECLARE @N INT;
SET @N=10;
SELECT TOP 1 WITH TIES
 K.klient_name,
 d.document_number,
 d.document_date
FROM [dbo].[documents] d JOIN [dbo].[Klient] K ON d.[klient_id]=K.klient_id
ORDER BY ROW_NUMBER()OVER(PARTITION BY d.[klient_id] ORDER BY d.[document_date] DESC)/(@N+1);
Второй вариант, наверно, помедленнее будет...
4 июн 09, 19:35    [7267260]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить