2010-01-04 36 views
12

dayalı grup başına en yeni değerler Al Ben Oracle DBOracle SQL sorgusu: Zaman

id  date    quantity 
1  2010-01-04 11:00 152 
2  2010-01-04 11:00 210 
1  2010-01-04 10:45 132 
2  2010-01-04 10:45 318 
4  2010-01-04 10:45 122 
1  2010-01-04 10:30 1 
3  2010-01-04 10:30 214 
2  2010-01-04 10:30 5515 
4  2010-01-04 10:30 210 

aşağıdaki tabloda şimdi id başına son değeri (ve zaman) almak istiyorum var. Örnek çıktı:

id  date    quantity 
1  2010-01-04 11:00 152 
2  2010-01-04 11:00 210 
3  2010-01-04 10:30 214 
4  2010-01-04 10:45 122 
Sadece bir sorgunun içine koymak için nasıl bilemiyorum

...

Ayrıca aşağıdaki seçenekler güzel olurdu:

Seçenek 1: Sorgu yalnızca gerektiği Son XX dakikadaki dönüş değerleri.

Seçenek 2: kimlik, kimliği ve kimliği olan başka bir tablodaki metinle birleştirilmelidir. ID için çıktı aşağıdaki gibi olmalıdır: id-idname (örneğin 1-testid1).

Yardımlarınız için çok teşekkürler!

+0

"DATE" belirli bir "ID" için benzersiz mi? – APC

+0

zaman damgası benzersiz olmalı, ancak görünüşe göre mevcut olan verilerde değil - bu nedenle çözüm işe yaramıyor. – Tom

cevap

21

...

SQL> select * from qtys 
    2/

     ID TS      QTY 
---------- ---------------- ---------- 
     1 2010-01-04 11:00  152 
     2 2010-01-04 11:00  210 
     1 2010-01-04 10:45  132 
     2 2010-01-04 10:45  318 
     4 2010-01-04 10:45  122 
     1 2010-01-04 10:30   1 
     3 2010-01-04 10:30  214 
     2 2010-01-04 10:30  5515 
     4 2010-01-04 10:30  210 

9 rows selected. 

SQL> 

... Aşağıdaki sorgu WHERE yan tümcesi sizin ek gereksinimler ile ilgili olarak

SQL> select x.id 
    2   , x.ts as "DATE" 
    3   , x.qty as "QUANTITY" 
    4 from (
    5  select id 
    6    , ts 
    7    , rank() over (partition by id order by ts desc) as rnk 
    8    , qty 
    9  from qtys) x 
10 where x.rnk = 1 
11/

     ID DATE    QUANTITY 
---------- ---------------- ---------- 
     1 2010-01-04 11:00  152 
     2 2010-01-04 11:00  210 
     3 2010-01-04 10:30  214 
     4 2010-01-04 10:45  122 

SQL> 

, sen dış ek filtreler uygulayabilirsiniz ... istediğini verir. Benzer şekilde, diğer tablolarda olduğu gibi satır içi görünümde ek tablolara katılabilirsiniz.

+0

teşekkürler, temel sorgu düzgün çalışıyor. sadece zaman damgasının her zaman benzersiz olmadığını öğrendim, bu yüzden her bir kimlik için birden çok giriş var, ancak başlangıçta bir DISTINCT ekledim. Şimdi ek seçenekleri deneyecek. – Tom

+0

DISTINCT'i iç veya dış seçime eklemek daha iyi performansa sahip olur mu? – Tom

+0

DISTINCT, elde ettiğiniz sonuçları, "miktar" değerlerinin maksimum "tarih" değerleri için eşleşmediği sürece değiştirmeyecektir. Uygun iş kuralının ne olduğunu keşfetmeli ve uygulamalıdır. Olasılıklar arasında "max (miktar)", "min (miktar)" veya "ort (miktar)" bulunur, ancak birçok olası çözünürlük vardır. – APC

6

İşte tam, test edilmiş bir örnek.

CREATE TABLE tbl1 (ID NUMBER, dt DATE, quantity NUMBER); 

DELETE FROM tbl1; 
insert into tbl1 values (1,to_date('2010-01-04 11:00','YYYY-MM-DD HH24:MI'), 152); 
insert into tbl1 values (2,to_date('2010-01-04 11:00','YYYY-MM-DD HH24:MI'), 210); 
insert into tbl1 values (1,to_date('2010-01-04 10:45','YYYY-MM-DD HH24:MI'), 132); 
insert into tbl1 values (2,to_date('2010-01-04 10:45','YYYY-MM-DD HH24:MI'), 318); 
insert into tbl1 values (4,to_date('2010-01-04 10:45','YYYY-MM-DD HH24:MI'), 122); 
insert into tbl1 values (1,to_date('2010-01-04 10:30','YYYY-MM-DD HH24:MI'), 1); 
insert into tbl1 values (3,to_date('2010-01-04 10:30','YYYY-MM-DD HH24:MI'), 214); 
insert into tbl1 values (2,to_date('2010-01-04 10:30','YYYY-MM-DD HH24:MI'), 5515); 
insert into tbl1 values (4,to_date('2010-01-04 10:30','YYYY-MM-DD HH24:MI'), 210); 

SELECT t.ID 
    , t.DT 
    , t.QUANTITY 
    FROM tbl1 t 
    ,(SELECT ID 
      , MAX(dt) dt 
      FROM tbl1 
     GROUP BY ID) t2 
    WHERE t.id = t2.id 
    AND t.dt = t2.dt 

Sonuçlar:

1 1/4/2010 11:00:00 AM 152 
2 1/4/2010 11:00:00 AM 210 
3 1/4/2010 10:30:00 AM 214 
4 1/4/2010 10:45:00 AM 122 

son XX dakika kayıtlarını almak istiyorsanız, bu örnekte 500 dakika kullanıyorum (bunu yapabilirsiniz, ne olursa olsun 500 yerine sen arzu): Bu veriler göz önüne alındığında

SELECT t.ID 
     , t.DT 
     , t.QUANTITY 
    FROM tbl1 t 
     ,(SELECT ID 
       , MAX(dt) dt 
      FROM tbl1 
      WHERE dt >= SYSDATE - (500/1400) 
      GROUP BY ID) t2 
    WHERE t.id = t2.id 
     AND t.dt = t2.dt; 
+0

Cevabınız için de oy verdim, sadece diğer ifadenin sözdizimini tercih ediyorum. – Tom