İstatistiklerini bir veritabanı dosyası olarak çıkarmaya izin veren bir basketbol oyunu oynuyorum, böylece oyunda uygulanmayan istatistikleri hesaplayabiliyorum. Şimdiye kadar istediğim istatistikleri hesaplarken hiç sorun yaşamadım, ama şimdi bir sorunla karşılaşıyorum: sezon boyunca bir oyuncunun oyun istatistiklerinden yaptığı iki kat ve / veya üç kat sayısını saymak.
Bir double double ve triple double tanımı şu şekildedir:
Çift-çift:
Double-double, bir oyuncunun bir oyunda beş istatistik kategorisinden ikisinde (puan, ribaunt, asist, top çalma ve engellenen atışlar) çift haneli sayı toplamı yaptığı bir performans olarak tanımlanır.
Üçlü çift:
Üçlü çift, bir oyuncunun bir oyunda beş istatistiksel kategoriden üçünde (puan, ribaunt, asist, top çalma ve engellenen atışlar) toplamda çift haneli bir sayı toplamış bir performans olarak tanımlanır.
Dörtlü çift (açıklama için eklendi)
Dörtlü çift, bir oyuncunun bir oyunda beş istatistik kategorisinden dördünde (puan, ribaunt, asist, top çalma ve engellenen atışlar) toplamda çift haneli bir sayı topladığı bir performans olarak tanımlanır.
"PlayerGameStats" tablosu, bir oyuncunun oynadığı ve oynadığı her oyun için istatistikleri depolar:
CREATE TABLE PlayerGameStats AS SELECT * FROM ( VALUES
( 1, 1, 1, 'Nuggets', 'Cavaliers', 6, 8, 2, 2, 0 ),
( 2, 1, 2, 'Nuggets', 'Clippers', 15, 7, 0, 1, 3 ),
( 3, 1, 6, 'Nuggets', 'Trailblazers', 11, 11, 1, 2, 1 ),
( 4, 1, 10, 'Nuggets', 'Mavericks', 8, 10, 2, 2, 12 ),
( 5, 1, 11, 'Nuggets', 'Knicks', 23, 12, 1, 0, 0 ),
( 6, 1, 12, 'Nuggets', 'Jazz', 8, 8, 11, 1, 0 ),
( 7, 1, 13, 'Nuggets', 'Suns', 7, 11, 2, 2, 1 ),
( 8, 1, 14, 'Nuggets', 'Kings', 10, 15, 0, 3, 1 ),
( 9, 1, 15, 'Nuggets', 'Kings', 9, 7, 5, 0, 4 ),
(10, 1, 17, 'Nuggets', 'Thunder', 13, 10, 10, 1, 0 )
) AS t(id,player_id,seasonday,team,opponent,points,rebounds,assists,steals,blocks);
Elde etmek istediğim çıktı şu şekilde:
| player_id | team | doubleDoubles | tripleDoubles |
|-----------|---------|---------------|---------------|
| 1 | Nuggets | 4 | 1 |
Şimdiye kadar bulduğum tek çözüm o kadar korkunç ki beni kusacak ...; o) ... Şöyle görünüyor:
SELECT
player_id,
team,
SUM(CASE WHEN(points >= 10 AND rebounds >= 10) OR
(points >= 10 AND assists >= 10) OR
(points >= 10 AND steals >= 10)
THEN 1
ELSE 0
END) AS doubleDoubles
FROM PlayerGameStats
GROUP BY player_id
... ve şimdi de bunu okuduktan sonra muhtemelen kusuyorsun (ya da çok gülüyorsun). Tüm çift çift kombinasyonları elde etmek için gereken her şeyi bile yazmadım ve üçlü çiftler için durum bildirimini atladım, çünkü daha saçma.
Bunu yapmanın daha iyi bir yolu var mı? Ya tablo yapısı ile ya da yeni bir tablo yapısı ile (tablo dönüştürmek için bir komut dosyası yazabilirim).
MySQL 5.5 veya PostgreSQL 9.2 kullanabilirim.
Örnek veriler ve yukarıda gönderdiğim korkunç çözüm ile SqlFiddle bağlantısı: http://sqlfiddle.com/#!2/af6101/3
Bildiğim kadarıyla oynadığım oyunda meydana gelmedikleri için dörtlü çiftlerle (yukarı bakın) gerçekten ilgilenmiyorum, ancak hesap çok fazla yeniden yazma olmadan kolayca genişletilebilirse, bir artı olur dörtlü çiftler için.