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

Откуда:
Сообщений: 43
Добрый день!

Есть вопрос, никак не могу придумать как решить.
Есть таблица с соответствующими полями: ClientID|OrderID|...|
Поле OrderID имеет свойство identity и является уникальным.
Примерный вид таблицы:

11|34|...|
11|41|...|
11|45|...|
11|46|...|
24|46|...|
24|97|...|
26|81|...|
26|86|...|
26|95|...|
47|01|...|
47|07|...|

(ROWCOUNT = 11)

Нужно сделать запрос, чтобы получить, к примеру, 2 первых заказа(OrderID упорядочен по возрастанию)
для каждого клиента. Т.е. результат должен выглядеть так:

11|34|...|
11|41|...|
24|46|...|
24|97|...|
26|81|...|
26|86|...|
47|01|...|
47|07|...|

(ROWCOUNT = 8)

з.ы.: 1. Объем таблицы очень большой, так что делать union запросов по каждому ClientID - не вариант.
2. Работы с курсором тоже желательно избежать.
3. Количество заказов, которые нужно получить, на самом деле переменная.
11 сен 09, 11:57    [7646696]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
а версия сервера?
--------------------------------------------------------------
Дьявол кроется в деталях.
11 сен 09, 12:03    [7646760]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
ggarek
Member

Откуда:
Сообщений: 43
Все дело происходит в MSSQL 2008.
11 сен 09, 12:09    [7646808]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
sky
Member

Откуда:
Сообщений: 281
для 2005 вроде так
select clientid, a.orderid from table t1
cross apply
(select top 2 orderid from table  t2 where t1. clientid=t2.clientid ) a

для 2000 через нумерацию записей в группировке и выбор = 2
11 сен 09, 12:09    [7646809]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
declare @t table(ClientID int, OrderID int)
insert into @t(ClientID, OrderID)
select 11, 34 union all
select 11, 41 union all
select 11, 45 union all
select 11, 46 union all
select 24, 46 union all
select 24, 97 union all
select 26, 81 union all
select 26, 86 union all
select 26, 95 union all
select 47, 01 union all
select 47, 07

declare @top int
set @top = 2

;with cte as (
   select ClientID, OrderID
         ,row_number() over(partition by ClientID order by OrderID) as rn
     from @t
)
select *
  from cte
 where rn <= @top

ClientID    OrderID     rn
----------- ----------- --------------------
11          34          1
11          41          2
24          46          1
24          97          2
26          81          1
26          86          2
47          1           1
47          7           2

(8 row(s) affected)
11 сен 09, 12:19    [7646891]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
1
WITH CTE AS(SELECT ROW_NUMBER()OVER(PARTITION BY ClientID ORDER BY OrderID) N,* FROM [Table])
SELECT * FROM CTE WHERE N<=2;
2
SELECT TOP 1 WITH TIES *
FROM [Table]
ORDER BY ROW_NUMBER()OVER(PARTITION BY ClientID ORDER BY OrderID)/3;
11 сен 09, 12:19    [7646892]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
DECLARE  @t TABLE (ClientID int,OrderID int identity(1,1))

INSERT INTO @t(ClientID)
SELECT 11 UNION ALL
SELECT 11 UNION ALL
SELECT 11 UNION ALL
SELECT 11 UNION ALL
SELECT 24 UNION ALL
SELECT 24 UNION ALL
SELECT 26 UNION ALL
SELECT 26 UNION ALL
SELECT 26 UNION ALL
SELECT 47 UNION ALL
SELECT 47 


SELECT t1.ClientID, t1.OrderID FROM @t AS t1
WHERE t1.OrderID = (SELECT MIN(t2.OrderID) FROM @t AS t2 WHERE t2.ClientID=t1.ClientID)
OR t1.OrderID =(SELECT MIN(t2.OrderID) FROM @t AS t2 WHERE t2.ClientID=t1.ClientID AND
t2.OrderID > (SELECT MIN(t3.OrderID) FROM @t AS t3 WHERE t3.ClientID=t1.ClientID))

упс...

ggarek
Все дело происходит в MSSQL 2008.
11 сен 09, 12:22    [7646903]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
sky
Member

Откуда:
Сообщений: 281
ошибся малость
select distinct clientid, a.orderid from table t1
cross apply
(select top 2 orderid from table  t2 where t1. clientid=t2.clientid order by newid() -- произвольные договора
) a
11 сен 09, 12:45    [7647042]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
ggarek
Нужно сделать запрос, чтобы получить, к примеру, 2 первых заказа(OrderID упорядочен по возрастанию)
sky
order by newid() -- произвольные договора
И как одно с другим согласуется?
11 сен 09, 12:49    [7647059]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
sky
Member

Откуда:
Сообщений: 281
упс... ну так... мало-ли, условия задачи поменяются :)
11 сен 09, 13:18    [7647271]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
ggarek
Member

Откуда:
Сообщений: 43
Всем большое спасибо!

остановился на таком способе:

SELECT db1.clientID, db2.orderID
FROM 
	(SELECT DISTINCT clientID
	 FROM OrderTBL) as db1
CROSS APPLY
	(SELECT TOP 3 orderID
	 FROM OrderTBL
	 WHERE clientID = db1.cllientID
	 ORDER BY orderID ASC) as db2
ORDER BY
	clientID DESC, orderID DESC
11 сен 09, 15:34    [7648419]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
ggarek
Всем большое спасибо!

остановился на таком способе:

SELECT db1.clientID, db2.orderID
FROM 
	(SELECT DISTINCT clientID
	 FROM OrderTBL) as db1
CROSS APPLY
	(SELECT TOP 3 orderID
	 FROM OrderTBL
	 WHERE clientID = db1.cllientID
	 ORDER BY orderID ASC) as db2
ORDER BY
	clientID DESC, orderID DESC

row_number скорее всего побыстрее будет...
11 сен 09, 15:45    [7648514]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
ggarek
Member

Откуда:
Сообщений: 43
Алексей2003,

наверно =), я просто с ним впервые столкнулся - сейчас изучаю.

Буду пробовать
11 сен 09, 15:47    [7648527]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить