Mysql
 sql >> Datenbank >  >> RDS >> Mysql

löschen mind. Werte aus Datensätzen nach dem Vergleich von zwei Werten aus der Tabelle in SQL

Finden Sie die Zeilen, die Sie löschen möchten, mit dieser Abfrage:

select t0.* 
from tbl_entso_cdbf t0
join tbl_entso_cdbf t1
  on  t1.Utc  = t0.Utc
  and t1.date = t0.date
  and t1.area_in  = t0.area_out
  and t1.area_out = t0.area_in
where t0.value = 0
  and (t1.value <> 0 or t1.area_in < t0.area_in);

Die Bedingungen sind:

  • value = 0
  • Es gibt eine weitere Zeile mit demselben Utc und dasselbe date aber area_in und area_out geschaltet werden.
  • Der value der anderen Zeile ist nicht 0 oder area_in ist kleiner.

Die Abfrage gibt die folgenden Zeilen zurück:

|               Utc |                date | area_in | area_out | value |
|-------------------|---------------------|---------|----------|-------|
| 2015-12-05T03:00Z | 2015-12-05 03:00:00 |      40 |      275 |     0 |
| 2015-12-06T03:00Z | 2015-12-06 03:00:00 |     175 |      100 |     0 |
| 2015-11-04T03:00Z | 2015-11-04 03:00:00 |     310 |      280 |     0 |
| 2016-09-19T00:00Z | 2016-09-19 00:00:00 |     292 |      187 |     0 |

Verwenden Sie es jetzt in einer Unterabfrage der Löschanweisung:

delete t1
from tbl_entso_cdbf t1
natural join (
    select t0.*
    from tbl_entso_cdbf t0
    join tbl_entso_cdbf t1
      on  t1.Utc  = t0.Utc
      and t1.date = t0.date
      and t1.area_in  = t0.area_out
      and t1.area_out = t0.area_in
    where t0.value = 0
      and (t1.value <> 0 or t1.area_in < t0.area_in)    
) t0;

NATURAL JOIN bedeutet, dass alle Spaltenwerte gleich sein müssen. Wenn Sie einen primären (oder eindeutigen) Schlüssel hätten, müssten Sie nur die primären (eindeutigen) Schlüsselspalten in der Unterabfrage anstelle von * auswählen .

Jetzt sind nur noch folgende Zeilen in der Tabelle übrig:

|               Utc |                date | area_in | area_out | value |
|-------------------|---------------------|---------|----------|-------|
| 2015-12-05T03:00Z | 2015-12-05 03:00:00 |     275 |       40 |   320 |
| 2015-12-06T03:00Z | 2015-12-06 03:00:00 |     100 |      175 |   550 |
| 2015-11-04T03:00Z | 2015-11-04 03:00:00 |     280 |      310 |     0 |
| 2016-09-19T00:00Z | 2016-09-19 00:00:00 |     187 |      292 |    45 |