Select Abfrage um Einträge zu bekommen die immer den Wert 0 hatten

Crafter

Neuer Benutzer
Beiträge
3
Hallo zusammen,
ich habe eine Tabelle in der ich die Snapshots der Bestände mehrerer Produkte täglich gespeichert habe.
Nun suche ich nach einer Abfrage mit der ich jeweils alle "models" bekomme die im angegeben Zeitraum immer 0 waren.
Ein Beispiel:
Code:
+-----+--------+----------+---------------------+
| id  | model  | quantity |         day         |
+-----+--------+----------+---------------------+
|   1 | TE-ST1 |        0 | 2021-05-01 00:00:00 |
|   2 | TE-ST2 |        0 | 2021-05-01 00:00:00 |
|   3 | TE-ST3 |        1 | 2021-05-01 00:00:00 |
|   4 | TE-ST1 |        0 | 2021-05-02 00:00:00 |
|   5 | TE-ST2 |        2 | 2021-05-02 00:00:00 |
|   6 | TE-ST3 |        0 | 2021-05-02 00:00:00 |
| ... | ...    |      ... | ....                |
|  91 | TE-ST1 |        0 | 2021-05-31 00:00:00 |
|  92 | TE-ST2 |        0 | 2021-05-31 00:00:00 |
|  93 | TE-ST3 |        6 | 2021-05-31 00:00:00 |
+-----+--------+----------+---------------------+
Angenommen alles im '...' Bereich hat für 'quantity' den Wert 0, dann soll das Ergebnis der Abfrage sein:
TE-ST1
da nur das Produkt mit model "TE-ST1" immer 'quantity' Wert 0 hatte.

Bisher habe ich einfach alle Produkte aus der Tabelle geholt und das ganze über PHP gelöst. Aber da es sich um ca 1 Millionen Datensätze handelt ist das sehr speicherintensiv. Meine bisherige Abfrage lautete:
Code:
"SELECT
        model,
        quantity,
        FROM
        `track_quantity_daily`
        WHERE
        day >= 2021-05-01 AND day <= 2021-05-31"
Aber damit bekomme ich wie gesagt einfach nur alle Produkte in einem bestimmten Zeitraum. Aber ich möchte nur die Produkte (model) die in jeder Zeile für das Feld quantity den Wert 0 hatten.

Hat jemand eine Idee wie so eine SELECT Abfrage lauten muss?
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.933
vereinfachte Tabelle und Lösung:

Code:
edb=*# select * from crafter ;
 model | quantity
-------+----------
 a     |        1
 a     |        0
 B     |        0
 B     |        0
 c     |        2
 c     |        3
(6 rows)

edb=*# with tmp as (select model, array_agg(distinct quantity) from crafter group by model) select * from tmp where array_agg = array[0];
 model | array_agg
-------+-----------
 B     | {0}
(1 row)

edb=*#
 

dabadepdu

Datenbank-Guru
Beiträge
1.179
Du kannst mal das probieren, sollte sogar auf mySQL laufen:
Code:
select model from crafter group by model having sum(quantity) = 0
Für den etwas abgedrehten Fall, dass Quantity auch negativ sein kann, müsste man entsprechend die Aggregat Prüfung ändern mittels Min, Max ..
Je nach Mengengerüst (0 Quantity, 0 und >0 Quantity und nur >0) je Modell und Modellvarianten könnte es verschieden flott sein, mglw. auch schneller als die Lösung von akretschmer. (Aber kannst Du ja eh mit mySQL nicht nachvollziehen)
 

Crafter

Neuer Benutzer
Beiträge
3
vereinfachte Tabelle und Lösung:

Code:
edb=*# select * from crafter ;
 model | quantity
-------+----------
 a     |        1
 a     |        0
 B     |        0
 B     |        0
 c     |        2
 c     |        3
(6 rows)

edb=*# with tmp as (select model, array_agg(distinct quantity) from crafter group by model) select * from tmp where array_agg = array[0];
 model | array_agg
-------+-----------
 B     | {0}
(1 row)

edb=*#

Danke. Ich habe vergessen anzugeben das ich MySQL verwende. Leider scheint die Abfrage dort nicht zu funktionieren.

Du kannst mal das probieren, sollte sogar auf mySQL laufen:
Code:
select model from crafter group by model having sum(quantity) = 0
Für den etwas abgedrehten Fall, dass Quantity auch negativ sein kann, müsste man entsprechend die Aggregat Prüfung ändern mittels Min, Max ..
Je nach Mengengerüst (0 Quantity, 0 und >0 Quantity und nur >0) je Modell und Modellvarianten könnte es verschieden flott sein, mglw. auch schneller als die Lösung von akretschmer. (Aber kannst Du ja eh mit mySQL nicht nachvollziehen)
Vielen Dank. Tatsächlich gibt es auch ein paar Sonderfälle mit negativen Quantity Werten. Hast du ein Beispiel für mich wie ich die Abfrage mit Min und Max so abändern kann das es auch mit negativen Werte funktioniert?
 
Zuletzt bearbeitet:
Werbung:

Crafter

Neuer Benutzer
Beiträge
3
Ich hab es hinbekommen:
Code:
SELECT model FROM crafter WHERE day >= '2021-05-01 00:00:00' AND day <= '2021-05-32 00:00:00' GROUP BY model HAVING SUM(ABS(quantity)) = 0
Mit der ABS Funktion funktioniert es auch mit negativen Werten. Danke für den Stoß in die richtige Richtung.
 
Oben