kullanarak sürekli aralıklar nasıl gruplanır? Kategoriler, tarihler ve oranlar içeren bir tablom var. Her kategori farklı tarihler için farklı ücretlere sahip olabilir, bir kategori belirli bir tarihte yalnızca bir orana sahip olabilir.MySQL
Id CatId Date Rate
------ ------ ------------ ---------
000001 12 2009-07-07 1
000002 12 2009-07-08 1
000003 12 2009-07-09 1
000004 12 2009-07-10 2
000005 12 2009-07-15 1
000006 12 2009-07-16 1
000007 13 2009-07-08 1
000008 13 2009-07-09 1
000009 14 2009-07-07 2
000010 14 2009-07-08 1
000010 14 2009-07-10 1
Benzersiz indeksi (CatID, Tarih, Oranı) Ben grubun tüm sürekli tarih aralıkları için her bir kategori için mi sadece başlar ve Aralığın sonu tutacak. Önceki Örneğin , biz olurdu:
CatId Begin End Rate
------ ------------ ------------ ---------
12 2009-07-07 2009-07-09 1
12 2009-07-10 2009-07-10 2
12 2009-07-15 2009-07-16 1
13 2009-07-08 2009-07-09 1
14 2009-07-07 2009-07-07 2
14 2009-07-08 2009-07-08 1
14 2009-07-10 2009-07-10 1
Tam
WITH q AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY CatId, Rate ORDER BY [Date]) AS rnd,
ROW_NUMBER() OVER (PARTITION BY CatId ORDER BY [Date]) AS rn
FROM my_table
)
SELECT CatId AS catidd, MIN([Date]) as beginn, MAX([Date])as endd, Rate
FROM q
GROUP BY CatId, rnd - rn, Rate
ben Mysql'de aynı şeyi yapabilir Nasıl SQL FIDDLE SEE bir sonuç vermedi the forum benzer bir çözüm buldu ? Lütfen yardım edin!
Neden ((CatID, Oranı) = 'için örnek neleri gösterir 14,1) '2009-07-08' ile 2009-07-10 arası bir sonuç, altta yatan tabloda' 2009-07-09' yokken? Bakınız: Süreksizlik nedeniyle iki sonuç aralığı üreten '(CatId, Rate) = (12,1)'. – eggyal
Teşekkürler eggyal, şimdi düzeltildi – Fouzi