2016-06-07 2 views
0

Mein Tisch ist so (np_capacity):Wählen Sie Zeilen mit MAX (datetime) und erhalten Sie auch min Werte mit ihren Daten für eine Spalte?

id tower datetime    capacity 
---|----|---------------------|---------- 
1 | A | 2016-05-29 09:02:41 | 34676 
2 | B | 2016-05-29 09:02:41 | 10736 
5 | C | 2016-05-29 09:02:41 | 55664 
3 | D | 2016-05-29 09:02:41 | 32622 
4 | A | 2016-05-29 13:08:38 | 5474 
6 | B | 2016-05-29 13:08:38 | 20692 
7 | C | 2016-05-29 13:08:38 | 134802 
8 | D | 2016-05-29 13:08:38 | 4754 

und das ist meine Frage:

SELECT npc.*, 
       (SELECT min(c2.capacity) FROM np_capacity c2 WHERE c2.tower = npc.tower AND datetime BETWEEN (NOW() - INTERVAL 14 DAY) AND NOW()) minCapacity, 

       FROM (SELECT max(datetime) maxDatetime FROM np_capacity) c1 
       JOIN np_capacity npc ON (npc.datetime = c1.maxDatetime) 

Es werden alle Türme mit der max Datumzeit wählen dann für die Türme es wird auch die Auswahl Min Kapazität in der Tabelle für die letzten zwei Wochen. Der Ausgang ist so etwas wie dieses:

id tower datetime    capacity MinCapacity 
---|----|---------------------|----------|------------- 
4 | A | 2016-05-29 13:08:38 | 5474  | 5474 
6 | B | 2016-05-29 13:08:38 | 20692 | 10736 
7 | C | 2016-05-29 13:08:38 | 134802 | 55664 
8 | D | 2016-05-29 13:08:38 | 4754  | 4754 

Alles gut so weit. Die Datetime ist für das Maximum (Datetime) und die MinCapacity ist der Minwert für die letzten zwei Wochen und auch was ich will. Wie kann ich die spezifische Datetime auch für ausgewählte MinCapacity bekommen. (MinCapacityDate)

Antwort

0

du versuchen können, in SQLFiddle demonstriert. Wenn mehr als eine Zeile mit der Mindestkapazität vorhanden ist, wird das neueste Datum zurückgegeben.

SELECT np_capacity.id, np_capacity.tower, np_capacity.datetime 
     ,np_capacity.capacity, mincap.mincapacity 
     , MAX(tmincapdatetime.datetime) AS datetimeOfMin 
FROM (SELECT MAX(`datetime`) AS maxdatetime 
     FROM np_capacity) AS tmaxdatetime 
JOIN np_capacity 
    ON tmaxdatetime.maxdatetime = np_capacity.`datetime` 
LEFT JOIN (SELECT tower, MIN(capacity) as mincapacity 
      FROM np_capacity 
      WHERE `datetime` BETWEEN (NOW() - INTERVAL 14 DAY) AND NOW() 
      GROUP BY tower) AS mincap 
    ON mincap.tower = np_capacity.tower 
LEFT JOIN np_capacity AS tmincapdatetime 
    ON tmincapdatetime.`datetime` BETWEEN (NOW() - INTERVAL 14 DAY) AND NOW() 
     AND mincap.tower = tmincapdatetime.tower 
     AND mincap.mincapacity = tmincapdatetime.capacity 
GROUP BY np_capacity.id, np_capacity.tower, np_capacity.datetime 
    ,np_capacity.capacity, mincap.mincapacity 
ORDER BY tower; 
+0

Vielen Dank. Sieht so aus, als würde das funktionieren. Das einzige Problem hier ist, dass manchmal die Kapazität = 0 ist und die Abfrage diese Zeile aus irgendeinem Grund zweimal zurückgibt, aber das Hinzufügen von "AND capacity! = 0" unterhalb von Zeile 9 scheint zu funktionieren. Darf ich das machen? – Vlad

+0

@DrLizzard - Ich verstehe nicht die Situation, über die Sie sprechen. Gehen Sie zu dieser SQL-Fiddle und passen Sie die Daten an, um das beschriebene Problem darzustellen, und geben Sie dann die neue SQLFiddle-URL frei. Ich werde mir ansehen, worauf Sie sich beziehen. – AgRizzo

+0

http://sqlfiddle.com/#!9/24639/7 Die Tabelle wird von einer externen Quelle aufgefüllt. Manchmal enthält die Kapazitätsspalte eine Null. Wenn dies geschieht, gibt das von Ihrer Abfrage zurückgegebene Array doppelte Zeilen zurück. Ich möchte verhindern, dass Zeilen ausgewählt werden, in denen die Kapazität null enthält, und Sie möchten wissen, ob das SQLFiddle die richtigen Ergebnisse liefert. – Vlad

0

könnte durch Sie benötigen einen Join und eine, wo in

select a.*, b.min(capacity) 
from np_capacity as a 
where a.tower, datetime in (  
    select tower, max(datetime) 
    from np_capacity 
    group by tower) 
inner join np_capacity as b on a.tower = b.tower 
group by a.id, a.tower, a.datetime 
Verwandte Themen