CREATE TABLE operations (
id int auto_increment primary key,
time_stamp DATE,
product VARCHAR(255),
plan_week VARCHAR(255)
);
INSERT INTO operations (time_stamp, product, plan_week)
VALUES
("2020-01-01", "Product_A", "CW01"),
("2020-01-01", "Product_B", "CW01"),
("2020-01-01", "Product_C", "CW01"),
("2020-03-15", "Product_A", "CW01"),
("2020-03-15", "Product_B", "CW02"),
("2020-03-15", "Product_C", "CW02"),
("2020-03-15", "Product_D", "CW01");
Erwartetes Ergebnis:
time_stamp | product | plan_week | week_switch
---------------|---------------|---------------|-----------------
2020-01-01 | Product_A | CW01 | no
2020-01-01 | Product_B | CW01 | yes
2020-01-01 | Product_C | CW01 | yes
| | |
2020-03-15 | Product_A | CW01 | no
2020-03-15 | Product_B | CW02 | yes
2020-03-15 | Product_C | CW02 | yes
2020-03-15 | Product_D | CW01 | no
Im obigen Ergebnis möchte ich alle products
aus der Tabelle auflisten und die beiden time_stamps
miteinander vergleichen.
Wenn das plan_week
eines Produkts zwischen den beiden time_stamps
gewechselt hat, möchte ich, dass in der zusätzlichen Spalte week_switch
das Wort yes
eingefügt wird und wenn nicht das Wort {{X6 }} wird eingefügt.
Ich habe versucht, mit dieser Abfrage zu arbeiten, konnte sie jedoch nicht zum Laufen bringen:
SELECT time_stamp, product, plan_week,
(CASE WHEN MIN(plan_week) <> MAX(plan_week) THEN 'yes' ELSE 'no' END) AS week_switch
FROM operations
GROUP BY 1,2;
Was muss ich ändern, um das erwartete Ergebnis zu erzielen?
2 Antworten
Ich würde nur Fensterfunktionen verwenden:
select o.*,
(case when min(plan_week) over (partition by product) = max(plan_week) over (partition by product)
then 'no' else 'yes'
end) as switched
from operations o;
Wenn ich Ihre Anforderung richtig verstehe, hängt Ihre week_switch
Ergebniszeile nur von Ihrem Produkt ab, nicht von dessen Zeitstempel.
Berechnen Sie es also in einer Unterabfrage.
SELECT product,
(CASE
WHEN MIN(plan_week) <> MAX(plan_week) THEN 'yes'
ELSE 'no' END) AS week_switch
FROM operations
GROUP BY product
Verbinden Sie dann diese Unterabfrage mit Ihren Daten (fiddle).
WITH switched AS (
SELECT product,
CASE
WHEN MIN(plan_week) <> MAX(plan_week) THEN 'yes'
ELSE 'no' END AS week_switch
FROM operations
GROUP BY product
)
SELECT
operations.time_stamp,
operations.product,
operations.plan_week,
switched.week_switch
FROM operations
LEFT JOIN switched ON operations.product = switched.product
WHERE time_stamp in ('2020-01-01', '2020-03-15')
GROUP BY 1,2;
Neue Fragen
mysql
MySQL ist ein kostenloses Open-Source-RDBMS (Relational Database Management System), das SQL (Structured Query Language) verwendet. Verwenden Sie dieses Tag NICHT für andere DBs wie SQL Server, SQLite usw. Dies sind verschiedene DBs, die alle ihre eigenen SQL-Dialekte verwenden, um die Daten zu verwalten.