2017-01-11 4 views
0

Dies ist mein Tabellenlayout für VMs in unserem DC. Jede Stunde sammeln wir Metriken, wollen aber verhindern, dass eine Umfrage zweimal durchgeführt wird und dann für eine bestimmte Stunde mit doppelter Information endet.Wählen Sie eindeutige/eindeutige Einträge im Zeitfenster

Unten ist mein Tisch

VM_Name    NUM_VCPU POWER_STATE MEMORY_MB IMPORTEDTIMESTAMP 
------------------------------------------------------------------------- 
FERNANDO TEST 2012  4   1   16384  2017-01-10 10:13:42.353 
FERNANDO TEST 2012 R2 4   0   8192  2017-01-10 10:13:42.353 

Bevor die Abfrage ich die oben genannten Informationen

SELECT Count([VM_NAME]) as Num_VM 
     ,sum([NUM_VCPU]) as SUM_NUM_VCPU 
     ,SUM([MEMORY_MB]) as SUM_MEM_MB 
     ,SUM([MEMORY_MB])/1024 as SUM_MEM_GB 
     ,dateadd(hour, datediff(hour, 0, IMPORTEDTIMESTAMP), 0) as IMPORTEDTIMESTAMPROUND  
    FROM VM_DATA 
    Where POWER_STATE = 1 
    group by dateadd(hour, datediff(hour, 0, IMPORTEDTIMESTAMP), 0) 

zu bekommen verwenden Und ich bekomme

Num_VM SUM_NUM_VCPU SUM_MEM_MB SUM_MEM_GB IMPORTEDTIMESTAMPROUND 
---------------------------------------------------------------------------  
    2   |4  |24576  |24  |2017-01-10 16:00:00.000  
    1   |2  |12288  |12  |2017-01-11 02:00:00.000  
    1   |2  |12288  |12  |2017-01-11 03:00:00.000 

Wie Sie bei 04.00 sehen (2017-01-10 16: 00: 00.000) es gab eine Test-Doppel-Umfrage, und jetzt habe ich die doppelte Metrik an Ort und Stelle. Wie kann ich meine Abfrage anpassen, um bestimmte Werte zu erhalten? Ich denke, ich muss eine Unterabfrage durchführen, bin mir aber nicht sicher, wo.

Edit für weitere Klarstellung.

Also am 2017-01-10 16: 00: 00.000 Ich habe zweimal abgefragt, jetzt habe ich doppelte Datensätze drin. Ich brauche verschiedene vm_name und deutliche timesstmap Wählen Sie die Duplikate zu entfernen, und dann alle vms zählen, resümieren die CPU und Speicher und gruppieren sie durch die timesatmp

Antwort

0
case when (count(dateadd(hour, datediff(hour, 0, IMPORTEDTIMESTAMP), 0))-count(Distinct(VM_Name))) = 0 then SUM(NUM_VCPU) 
    else SUM(NUM_VCPU)/(count(dateadd(hour, datediff(hour, 0, IMPORTEDTIMESTAMP), 0))/count(Distinct(VM_Name))) end as SUM_VCPU 

Ill haben dies zu bereinigen, aber was ich damit gearbeitet kam. Es prüft, ob die Anzahl der VM_Names mit der Anzahl der Zeitstempel übereinstimmt. Wenn ich mehr Zeitstempel als eindeutige Namen habe, weiß ich, dass ich mehrere Einträge für einen bestimmten Zeitraum habe. Ich mache eine Aufteilung in die Summe, um die richtige Nummer zu bekommen

Ich weiß nicht, ob es eine schönere Möglichkeit, dies zu erreichen, aber es funktioniert.

0

Die einfachste Lösung zu verwenden ist avg():

SELECT Count([VM_NAME]) as Num_VM, 
     sum([NUM_VCPU]) as SUM_NUM_VCPU, 
     SUM([MEMORY_MB]) as SUM_MEM_MB, 
     SUM([MEMORY_MB])/1024 as SUM_MEM_GB, 
     dateadd(hour, datediff(hour, 0, IMPORTEDTIMESTAMP), 0) as IMPORTEDTIMESTAMPROUND  
FROM VM_DATA 
Where POWER_STATE = 1 
GROUP BY dateadd(hour, datediff(hour, 0, IMPORTEDTIMESTAMP), 0); 

Sonst. . . Verwenden Sie einfach row_number(). Keine Aggregation scheint notwendig:

select d.* 
from (select d.*, 
      (partition by year(IMPORTEDTIMESTAMP), month(IMPORTEDTIMESTAMP), day(IMPORTEDTIMESTAMP), datepart(hour, IMPORTEDTIMESTAMP) 
       order by IMPORTEDTIMESTAMP 
      ) as seqnum 
     from vm_data d 
    ) d 
where seqnum = 1; 
+0

Ich bearbeitet mein OP, um etwas Klärung hinzuzufügen. AVG funktioniert nicht, weil ich für eine bestimmte Stunde die Summe von CPU und Arbeitsspeicher, Anzahl der VMs benötige. –

0

Das Problem ist also, dass Ihre Datensätze nicht tatsächlich Duplikate sind, scheinen aber so wegen der Zeitstempel Runden? Was passiert, wenn Sie DISTINCT verwenden? Ich gehe davon aus, dass die Spalten berücksichtigt werden, bevor Sie Ihren Zeitstempel runden, was zu denselben Ergebnissen führt. Ich denke, du musst dein gerundetes Datum als Varchar darstellen, dann wird es vielleicht das Diskrete als echtes Duplikat erkennen.

Siehe: Returning Distinct Dates

SELECT DISTINCT Count([VM_NAME]) as Num_VM 
    ,sum([NUM_VCPU]) as SUM_NUM_VCPU 
    ,SUM([MEMORY_MB]) as SUM_MEM_MB 
    ,SUM([MEMORY_MB])/1024 as SUM_MEM_GB 
    ,CONVERT(char(10), dateadd(hour, datediff(hour, 0, IMPORTEDTIMESTAMP), 0), 126) as IMPORTEDTIMESTAMPROUND  
FROM VM_DATA 
Where POWER_STATE = 1 
group by CONVERT(char(10), dateadd(hour, datediff(hour, 0, IMPORTEDTIMESTAMP), 0), 126) 
+0

Ich bearbeitet mein OP zur Klärung am Ende –

+0

sehen, ob meine Bearbeitung Sinn macht/tut etwas zu helfen – Esten

Verwandte Themen