2016-04-06 30 views
-1

Yazmak için oldukça karmaşık bir sorgum var; Postgres kullanıyoruz.Bir tarihin güncellenene kadar geçerli olduğu iki tablodaki tarihler nasıl karşılaştırılır?

Tablo 1: üyelerine

show_id | Price | user_id | created_at 
    17 | 40 | 25  | 02/16/2016 
    17 | 40 | 26  | 02/16/2016 
    23 | 50 | 25  | 07/24/2015 

Ne yapmak istediğim yarattığı Fiyat uyarıları: Tarihsel bilet fiyatları

ticket_seller_id | show_id | low_price | created_at 
       1 | 17  | 40  | 05/09/2015 
       2 | 23  | 50  | 06/23/2015 
       2 | 23  | 60  | 07/23/2015 
       2 | 23  | 70  | 08/23/2015 
       3 | 23  | 55  | 07/22/2015 

Tablo 2 Temelde, iki tablo arasında veri var bir yaratmak SADECE fiyat uyarıları olan "uyarı fiyatı" nın mevcut bir tarihsel fiyattan daha düşük olduğu sonuç tablosu. Yukarıdaki verilerden, şu şekilde görünecektir: Kullanıcıya 25 den gösterisi 23 için 50 $ fiyat uyarı görüntülenebilir olmaz

show_id | Price | user_id | created_at 
    17 | 40 | 25  | 02/16/2016 

Not zamana göre kullanıcı bu fiyat uyarı oluşturup, çünkü LOW_PRICE vardı 60 dolara yükseldi. Ayrıca, her biletin her bilet için kendi düşük fiyatına sahip olduğunu unutmayın. Cevap, uyarının oluşturulduğu tarihten önceki bir tarihte oluşturulan herhangi bir bilet satıcısından elde edilebilecek en düşük fiyatı bulmalıdır. Fiyatlar güncellenmiş olana kadar geçerlidir, bu nedenle en düşük fiyat şu anda en düşük fiyat olduğu için, 2/23/2015'de satıcı 2'den 23 gösterim için en düşük fiyat 60 $ olacaktır.

Her türlü yardım mutluluk duyacaktır!

+1

Hangi DBMS'yi kullanıyorsunuz? –

+0

Ve neden user_id = 26 sonuçların bir parçası olmamalı? Bu satır aynı tarihte aynı fiyat ile yaratıldı user_id = 25 –

+0

@a_horse_with_no_name ile tamamen haklısınız! user_id = 26 dahil edilmelidir. Ve biz Postgres'i kullanıyoruz. –

cevap

0

bu deneyin:

select show_id, price, user_id, created_at 
from price_alerts 
where price < (
    select price 
    from ticket_history 
    where show_id = price_alerts.show_id 
    and created_at = (
    select max(created_at) 
    from ticket_history 
    where show_id = price_alerts.show_id 
    and created_at < price_alerts.created_at)) 

Orada satıcıya özgü pencere fonksiyonları burada kullanılabilir, ancak kullandığınız veritabanı ile sorunuzu etiketlemediğiniz, bu nedenle bu vanilya versiyonudur.

+0

Teşekkürler! Bu, yolun geri kalanını kendi başıma bulmak için yeterince yakınım oldu. –