Temat: Jaki był najdłuższy ciąg...
przyznam, rozwiazania pierwszego z kursorem nie sprawdzalem.. ale mam wiele niecheci do nich :)
rozwiazanie Michala wyglada ok, ale przy probach uogolnienia go do dowolnego zestawu produktow (nie tylko dwoch!) cos mi sie sypnelo..
rozwiazanie Norbeta hm.. a co z seriami? zliczanie rekordow gdzie ID jest < a produkt sie zgadza nie gwarantuje ze to bedzie CIAGLA SERIA zakupow tego produktu!!
w miedzy czasie wysmazylem cos takiego.. jest dluuugie i kilkuetapowe, ale to sa tylko selecty do tablic tymczasowych, wiec jak sie kto uprze, to mozna to nawet zlepic w .. jeden olbrzymi select :)
ah.. pisane na MSSQL2005. jedyna specyficzna rzecz jaka jest uzywana to row_number() over (order by ..) -- da sie to zamienic na dowolny ROWNUM z sortowaniem
create table #temp(id int,klient int,prod char,data datetime)
insert into #temp select 1, 1, 'A', '2007-01-01'
insert into #temp select 2, 2, 'A', '2007-01-01'
insert into #temp select 3, 3, 'B', '2007-01-01'
insert into #temp select 4, 1, 'A', '2007-01-01'
insert into #temp select 5, 1, 'B', '2007-01-01'
insert into #temp select 6, 1, 'A', '2007-01-01'
insert into #temp select 7, 2, 'C', '2007-01-01'
insert into #temp select 8, 1, 'A', '2007-01-01'
insert into #temp select 9, 2, 'A', '2007-01-01'
--
select id, klient, prod, row_number() over (order by klient,id) as numerzakupu
into #listazakupow
from #temp
select *, row_number() over (order by t.klient, t.numerzakupu) as numerzmiany
into #listazmianwyboru
from
( select tmp.klient, tmp.numerzakupu
from #listazakupow tmp
left join #listazakupow tmp2 on tmp2.klient = tmp.klient and tmp2.numerzakupu = tmp.numerzakupu+1
where tmp.prod <> tmp2.prod
union all
select klient, min(numerzakupu)-1
from #listazakupow
group by klient
union all
select klient, max(numerzakupu)
from #listazakupow
group by klient
) t
select tmp.klient, zak.prod, tmp2.numerzakupu - tmp.numerzakupu as ilosc_pod_rzad
into #seriezakupow
from #listazmianwyboru tmp
join #listazmianwyboru tmp2 on tmp2.klient = tmp.klient and tmp2.numerzmiany = tmp.numerzmiany+1
left join #listazakupow zak on zak.numerzakupu = tmp2.numerzakupu
select s.klient, s.prod, s.ilosc_pod_rzad
from
( select klient, max(ilosc_pod_rzad) as ilosc_pod_rzad
from #seriezakupow
group by klient
) t
join #seriezakupow s on s.klient = t.klient and s.ilosc_pod_rzad = t.ilosc_pod_rzad
order by 1,3,2
--
drop table #seriezakupow
drop table #listazmianwyboru
drop table #listazakupow
drop table #temp
edit: wybacz formatowanie.. [code] ani <pre> nie dziala:/[edited]Tadeusz Pyś edytował(a) ten post dnia 09.01.08 o godzinie 12:05[/edited]