DB-Fiddle

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
Michi 1 Sept. 2020 im 22:10

2 Antworten

Beste Antwort

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;
0
Gordon Linoff 1 Sept. 2020 im 20:16

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;
1
O. Jones 1 Sept. 2020 im 19:35