Birden çok özellik tarafından mantıksal olarak gruplandırılabilen verileri barındıran bir tablom var (örneğin yabancı anahtar). Veriler sürekli zaman aralığı boyunca ardışıktır; yani bir zaman serisi verisidir. Elde etmeye çalıştığım şey, her grup grubu için yalnızca en yeni değerleri seçmek. İşte İlgili kayıtların grubu için en son değerleri seçin
örnek veridir:+-----------------------------------------+
| code | value | date | relation_id |
+-----------------------------------------+
| A | 1 | 01.01.2016 | 1 |
| A | 2 | 02.01.2016 | 1 |
| A | 3 | 03.01.2016 | 1 |
| A | 4 | 01.01.2016 | 2 |
| A | 5 | 02.01.2016 | 2 |
| A | 6 | 03.01.2016 | 2 |
| B | 1 | 01.01.2016 | 1 |
| B | 2 | 02.01.2016 | 1 |
| B | 3 | 03.01.2016 | 1 |
| B | 4 | 01.01.2016 | 2 |
| B | 5 | 02.01.2016 | 2 |
| B | 6 | 03.01.2016 | 2 |
+-----------------------------------------+
Ve burada istenen çıktı örneğidir:
+-----------------------------------------+
| code | value | date | relation_id |
+-----------------------------------------+
| A | 3 | 03.01.2016 | 1 |
| A | 6 | 03.01.2016 | 2 |
| B | 3 | 03.01.2016 | 1 |
| B | 6 | 03.01.2016 | 2 |
+-----------------------------------------+
Bu perspektif koymak için - her ilgili nesne için ben son tarihiyle her kodu seçmek istiyorum .
İşte geldiğim bir seçimdi. Ben ROW_NUMBER OVER (PARTITION BY...)
yaklaşım kullandım:
SELECT indicators.code, indicators.dimension, indicators.unit, x.value, x.date, x.ticker, x.name
FROM (
SELECT
ROW_NUMBER() OVER (PARTITION BY indicator_id ORDER BY date DESC) AS r,
t.indicator_id, t.value, t.date, t.company_id, companies.sic_id,
companies.ticker, companies.name
FROM fundamentals t
INNER JOIN companies on companies.id = t.company_id
WHERE companies.sic_id = 89
) x
INNER JOIN indicators on indicators.id = x.indicator_id
WHERE x.r <= (SELECT count(*) FROM companies where sic_id = 89)
O inşaat ama sorun acı yavaş olmasıdır; Yaklaşık 3 milyon fundamentals
kayıtlarına eşit olan üretim verilerinin yaklaşık% 5'i ile çalışırken bu seçimin tamamlanması yaklaşık 10 saniye sürmektedir. Tahminimce, önce büyük miktarlarda kayıt seçerek alt seçim yapılıyor.
Bu sorguyu hızlandırmanın herhangi bir yolu var mı, yoksa yanlış yoldan kazıyorum mı?
Çok teşekkürler deneyebilirsiniz inanıyoruz! Düşündüğüm daha kolay oldu; Başlangıçta, en basit çözümle ilgilenen biraz fazla karmaşıklaştırdım. – Ruslan