2016-07-20 5 views
0

Ich verwende vertica und benutze die min() Fensterfunktion, über ein Fenster. Die Funktion scheint jedoch für einige Fenster gut zu funktionieren, aber für einige Fenster gibt sie unterschiedliche Min-Werte im selben Fenster zurück. Gibt es etwas, das ich mit Blick auf binmin() Fensterfunktion in Vertica funktioniert nicht richtig - gibt verschiedene Werte für dasselbe Fenster zurück

select visid_high, visid_low, visit_num, date_time, visit_page_num, 
     min(visit_page_num) over (partition by visid_high , visid_low , visit_num order by date_time) as min_hotelinfo 
from prd_omniture_hit_data_all where pagename='Hotel Info - Home' and date(Date_time)='2016-06-19' order by visid_high, visid_low, visit_num, date_time 

Dies funktioniert gut für einige Fenster und kehrt zur Folge haben, wie unten

visid_high visid_low visit_num date_time visit_page_num min_hotelinfo 
1000025785676989783 3541599610445607061 1 6/19/2016 8:54 2 2 
1000025785676989783 3541599610445607061 1 6/19/2016 8:55 4 2 
1000025785676989783 3541599610445607061 1 6/19/2016 8:55 5 2 

visid_high visid_low visit_num date_time visit_page_num min_hotelinfo 
1000334043872452151 13928857828543794490 1 6/19/2016 14:56 2 2 
1000334043872452151 13928857828543794490 1 6/19/2016 14:57 6 2 
1000334043872452151 13928857828543794490 1 6/19/2016 14:57 7 2 
1000334043872452151 13928857828543794490 2 6/19/2016 16:09 2 2 
10006241273945967252 17961652664059791311 1 6/19/2016 20:09 2 2 
10006241273945967252 17961652664059791311 1 6/19/2016 20:09 4 2 
10006241273945967252 17961652664059791311 1 6/19/2016 20:10 8 2 

Doch für manche Fenster, ist es nicht richtig funktioniert

visid_high visid_low visit_num date_time visit_page_num min_hotelinfo 
10007599756616641840 269931436307846555 2 6/19/2016 19:51 2 2 
10007599756616641840 269931436307846555 2 6/19/2016 19:52 3 2 
10007599756616641840 269931436307846555 2 6/19/2016 19:52 5 2 
10007599756616641840 269931436307846555 2 6/19/2016 19:53 7 2 
10007599756616641840 269931436307846555 2 6/19/2016 19:53 9 2 
10007599756616641840 269931436307846555 2 6/19/2016 19:53 10 **10** 

10009683770139214971 14890994612952617462 2 6/19/2016 8:03 5 5 
10009683770139214971 14890994612952617462 2 6/19/2016 8:03 7 **5** 
10009683770139214971 14890994612952617462 2 6/19/2016 8:09 26 **26** 
10009683770139214971 14890994612952617462 2 6/19/2016 8:12 28 26 
10009683770139214971 14890994612952617462 2 6/19/2016 8:13 30 26 
10009683770139214971 14890994612952617462 2 6/19/2016 8:14 32 26 
10009683770139214971 14890994612952617462 2 6/19/2016 8:15 36 26 
10009683770139214971 14890994612952617462 2 6/19/2016 8:17 40 26 


visid_high visid_low visit_num date_time visit_page_num min_hotelinfo 
10012413883034897266 8201606845758098188 1 6/19/2016 7:22 4 4 
10012413883034897266 8201606845758098188 1 6/19/2016 7:24 5 4 
10012413883034897266 8201606845758098188 1 6/19/2016 7:24 8 4 
10012413883034897266 8201606845758098188 1 6/19/2016 7:24 7 4 
10012413883034897266 8201606845758098188 1 6/19/2016 7:24 6 **4** 
10012413883034897266 8201606845758098188 1 6/19/2016 8:04 16 **16** 
10012413883034897266 8201606845758098188 1 6/19/2016 8:06 20 16 
10012413883034897266 8201606845758098188 1 6/19/2016 8:06 25 16 
10012413883034897266 8201606845758098188 1 6/19/2016 8:07 28 16 
10012413883034897266 8201606845758098188 1 6/19/2016 8:07 30 16 
+0

Welche genaue Version von Vertica laufen Sie? 'select version();' – woot

+0

@woot Vertica Analytische Datenbank v7.2.3-0 – Teja

+0

Warum die 'Reihenfolge von' in der Fensterdefinition? Ich scheitere, also sehen Sie, warum Sie eine Bestellung brauchen, um das Minimum zu bekommen. Gewöhnlich verwandelt eine 'Ordnung durch' in einem Aggregat, das als eine Fensterfunktion verwendet wird, dieses in ein" laufendes Aggregat ". Funktioniert es so, wie Sie erwarten, dass es funktioniert, wenn Sie die 'Order by' entfernen? –

Antwort

1

Ordnen Sie das Fenster so an, dass die Partitionen ordnungsgemäß gruppiert werden.

select visid_high, visid_low, visit_num, date_time, visit_page_num, 
     min(visit_page_num) over 
     (partition by visid_high, visid_low, visit_num 
      order by visid_high, visid_low, visit_num) as min_hotelinfo 
from prd_omniture_hit_data_all 
where pagename = 'Hotel Info - Home' 
and date(Date_time) = '2016-06-19' 
order by visid_high, visid_low, visit_num, date_time 

Auch nicht möchten, Date_time auf diese Weise zu werfen. Es ist besser Casting zu vermeiden und Funktionen in Prädikaten zu verwenden, damit die Datenbank besser optimiert werden kann (nicht dass es möglich wäre, aber Sie geben ihr mehr Möglichkeiten).

where Date_time >= '2016-06-19' and Date_time < '2016-06-20' 
Verwandte Themen