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

Откуда:
Сообщений: 10
Есть таблица с двумя полями:
CustomerID TransactionDate
Cust1 09:49
Cust2 09:50
Cust2 09:51
Cust3 09:52
Cust1 09:53
Cust1 09:54
Cust2 09:55

Необходимо получит таблицу:
CustomerID RowIndex
Cust1 1
Cust2 1
Cust2 2
Cust3 1
Cust1 1
Cust1 2
Cust2 1
Как написать правельный запрос? Row_Number работает не совсем так как мне нужно.
15 апр 13, 17:41    [14183373]     Ответить | Цитировать Сообщить модератору
 Re: как сделать правельно группировку?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
вы навреное поменяли местами поля в partiton by и order by
15 апр 13, 17:49    [14183413]     Ответить | Цитировать Сообщить модератору
 Re: как сделать правельно группировку?  [new]
Chalmers
Member

Откуда:
Сообщений: 10
Если я запускаю SQL:
select ROW_NUMBER() OVER(PARTITION BY transactiondate ORDER BY customerid ) AS Row, iUserID as usercard, dTransactionDate as datedeliv, * from customer_transaction_head
получаю:
Row usercard datedeliv
1 Cust1 09:49
1 Cust2 09:50
2 Cust2 09:51
1 Cust3 09:52
2 Cust1 09:53
3 Cust1 09:54
3 Cust2 09:55

это не совсем то, что мне нужно. Если меняю местами partiton by и order by, то результат так же не правелный.
15 апр 13, 18:09    [14183548]     Ответить | Цитировать Сообщить модератору
 Re: как сделать правельно группировку?  [new]
qwerty112
Guest
Chalmers,

declare @t table (CustomerID varchar(10), TransactionDate datetime)
insert into @t
select 'Cust1', '09:49' union all
select 'Cust2', '09:50' union all
select 'Cust2', '09:51' union all
select 'Cust3', '09:52' union all
select 'Cust1', '09:53' union all
select 'Cust1', '09:54' union all
select 'Cust2', '09:55'

;with cte as
(select *, 
row_number() over(order by TransactionDate) - 
row_number() over(partition by CustomerID order by TransactionDate) as xz
from @t)

select CustomerID, TransactionDate, row_number() over(partition by CustomerID, xz order by TransactionDate) as RowIndex
from cte 
order by TransactionDate

CustomerID TransactionDate         RowIndex
---------- ----------------------- --------------------
Cust1      1900-01-01 09:49:00.000 1
Cust2      1900-01-01 09:50:00.000 1
Cust2      1900-01-01 09:51:00.000 2
Cust3      1900-01-01 09:52:00.000 1
Cust1      1900-01-01 09:53:00.000 1
Cust1      1900-01-01 09:54:00.000 2
Cust2      1900-01-01 09:55:00.000 1
15 апр 13, 18:18    [14183590]     Ответить | Цитировать Сообщить модератору
 Re: как сделать правельно группировку?  [new]
Chalmers
Member

Откуда:
Сообщений: 10
Спасибо огромное за query, qwerty112! Я вижу, что он работает, но пока еще не поняла почему:)
15 апр 13, 18:58    [14183763]     Ответить | Цитировать Сообщить модератору
 Re: как сделать правельно группировку?  [new]
Chalmers
Member

Откуда:
Сообщений: 10
qwerty112,

есть таблица:

declare @t table (CustomerID varchar(10), TransactionDate datetime)
insert into @t
select 'Cust1', '09:49' union all
select 'Cust2', '09:50' union all
select 'Cust2', '09:51' union all
select 'Cust3', '09:52' union all
select 'Cust2', '09:53' union all
select 'Cust1', '09:53' union all
select 'Cust1', '09:54' union all
select 'Cust2', '09:55' union all
select 'Cust1', '09:56' union all
select 'Cust2', '09:57'

задача примерно такая же, НО нужно, что бы с в одну и ту же subgroup входили записи, где один и тот же CustID и TransactionDate+/-2minut.
Результирующая таблица выглядит так:
CustomerID TransactionDate RowIndex
Cust1, 09:49, 1
Cust2, 09:50, 1
Cust2, 09:51, 2
Cust3, 09:52, 1
Cust2, 09:53, 3
Cust1, 09:53, 1
Cust1, 09:54, 2
Cust2, 09:55, 4
Cust1, 09:56, 3
Cust2, 09:57, 5
16 апр 13, 12:06    [14186207]     Ответить | Цитировать Сообщить модератору
 Re: как сделать правельно группировку?  [new]
qwerty112
Guest
Chalmers
задача примерно такая же, НО нужно, что бы с в одну и ту же subgroup входили записи, где один и тот же CustID и TransactionDate+/-2minut.

ойй, тибе не понравится ... :))
;with 
a as
(select CustomerID, dateadd(n, -1, TransactionDate) as st, dateadd(n, 1, TransactionDate) as fn from @t),
b as
(select v_begin.st, min(v_end.fn) as fn, v_begin.CustomerID
  from 
       ( -- Находим все начала диапазонов:
          select st, CustomerID
            from a s1
           where not exists (
                               select null
                                 from a s2
                                where s2.st < s1.st
                                  and s2.fn >= s1.st
                                  and s1.CustomerID = s2.CustomerID
                            )
       ) v_begin
  join 
       ( -- Находим все кончала диапазонов:
          select fn, CustomerID
            from a s1
           where not exists (
                               select null
                                 from a s2
                                where s2.fn > s1.fn
                                  and s2.st <= s1.fn
                                  and s1.CustomerID = s2.CustomerID
                            )
       ) v_end
--
-- Сливаем начала с кончалами:
    on v_begin.st <= v_end.fn
   and v_begin.CustomerID = v_end.CustomerID
 group by v_begin.st, v_begin.CustomerID)

select t.CustomerID, row_number() over(partition by t.CustomerID, b.st, b.fn order by t.TransactionDate) as RowIndex
from @t t inner join b
on t.CustomerID=b.CustomerID and t.TransactionDate between b.st and b.fn
order by t.TransactionDate

CustomerID RowIndex
---------- --------------------
Cust1      1
Cust2      1
Cust2      2
Cust3      1
Cust2      3
Cust1      1
Cust1      2
Cust2      4
Cust1      3
Cust2      5

(10 row(s) affected)
16 апр 13, 13:39    [14186839]     Ответить | Цитировать Сообщить модератору
 Re: как сделать правельно группировку?  [new]
Chalmers
Member

Откуда:
Сообщений: 10
qwerty112,

Super! Спасибо!
16 апр 13, 13:50    [14186881]     Ответить | Цитировать Сообщить модератору
 Re: как сделать правельно группировку?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2995
Chalmers,
проверьте этот, вроде работает как надо и попроще

;with 
num as (
select 0 as n union all select 1 union all select 2),

cte as
(select distinct t.*, 
dense_rank() over(order by dateadd(mi, n.n, t.TransactionDate)) - 
dense_rank() over(partition by t.CustomerID order by dateadd(mi, n.n, t.TransactionDate)) as xz
from @t t, num n)
select CustomerID, TransactionDate, row_number() over(partition by CustomerID, xz order by TransactionDate) as RowIndex
from cte 
order by TransactionDate
16 апр 13, 14:47    [14187279]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить