Válassza feljegyzések, hogy megváltozott a korábbi értékek

szavazat
0

Van egy táblázat, ahol regisztrálni a történelem, a termékek árát a katalógusban (egy másik táblázatot).

Az ár minden termék lehet változtatni bármikor így kell azonosítani csak annyit termékek megváltoztatták az árakat. Például én ezt a táblázatot:

+----+--------------+-------+---------------------+
| id | product_code | price | price_date          |
+----+--------------+-------+---------------------+
|  1 | P01          | 10.00 | 2019-01-01 00:00:00 |
|  2 | P01          | 15.00 | 2019-01-03 00:00:00 |
|  3 | P01          | 20.00 | 2019-01-05 00:00:00 |
|  4 | P01          | 15.00 | 2019-01-09 00:00:00 |
|  5 | P02          | 10.00 | 2019-01-04 00:00:00 |
|  6 | P02          | 15.00 | 2019-01-06 00:00:00 |
|  7 | P02          | 15.00 | 2019-01-07 00:00:00 |
|  8 | P03          | 15.00 | 2019-01-09 00:00:00 |
|  9 | P04          | 15.00 | 2019-01-01 00:00:00 |
| 10 | P04          | 15.00 | 2019-01-02 00:00:00 |
| 11 | P04          | 25.00 | 2019-01-05 00:00:00 |
| 12 | P05          | 15.00 | 2019-01-01 00:00:00 |
| 13 | P05          | 15.00 | 2019-01-02 00:00:00 |
+----+--------------+-------+---------------------+

és azt kell ezt az eredményt:

+--------------+-------+---------------------+
| product_code | price | price_date          |
+--------------+-------+---------------------+
|          P01 | 20.00 | 2019-01-05 00:00:00 |
|          P01 | 15.00 | 2019-01-09 00:00:00 |
|          P04 | 15.00 | 2019-01-02 00:00:00 |
|          P04 | 25.00 | 2019-01-05 00:00:00 |
+--------------+-------+---------------------+

és ez a kivételekkel:

P02 nem változott az ára így figyelmen kívül hagyja (igen, ugyanazon az áron lehet regisztrálni többször egymás után)

P03 csak 1-nyilvántartás, így technikailag nem változott az ára, úgyhogy hagyja figyelmen kívül (ez nagyon ritka, de néhány termék nem változnak az árak)

P05 nem változott az ára így figyelmen kívül hagyja

Tettem ezt adatokat annak érdekében, hogy olvassa el könnyen, de technikailag az adatokat lehet bármilyen sorrendben.

Küldök neked a lekérdezés, így nem túl sok időt:

CREATE TABLE PriceHistory(
id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL,
product_code CHAR(3) NOT NULL,
price DECIMAL(5,2) NOT NULL,
price_date DATETIME NOT NULL,
PRIMARY KEY (id));

INSERT INTO PriceHistory(product_code, price, price_date) VALUES
('P01', 10, '2019-01-01'),
('P01', 15, '2019-01-03'),
('P01', 20, '2019-01-05'),
('P01', 15, '2019-01-09'),
('P02', 10, '2019-01-04'),
('P02', 15, '2019-01-06'),
('P02', 15, '2019-01-07'),
('P03', 15, '2019-01-09'),
('P04', 15, '2019-01-01'),
('P04', 15, '2019-01-02'),
('P04', 25, '2019-01-05'),
('P05', 15, '2019-01-01'),
('P05', 15, '2019-01-02');

Előre is köszönöm.

A kérdést 10/10/2019 00:50
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
0

Ez nem pontos válasz, hogy pontosan azért, mert elvárom, hogy az eredmények minden sorban, de ez a válasz elég jó, és kap a munkahelyek tenni:

SELECT info1.*, info2.* FROM
(SELECT lasts.product_code, lasts.id AS last_id, penultimate.id AS penultimate_id FROM
    (SELECT product_code, MAX(id) AS id FROM PriceHistory GROUP BY product_code HAVING COUNT(product_code) > 1) lasts
INNER JOIN
    (SELECT product_code, MAX(id) AS id FROM PriceHistory WHERE id NOT IN (SELECT MAX(id) FROM PriceHistory GROUP BY product_code) GROUP BY product_code) penultimate
ON lasts.product_code = penultimate.product_code) relations
INNER JOIN PriceHistory info1 ON relations.last_id = info1.id
INNER JOIN PriceHistory info2 ON relations.penultimate_id = info2.id
WHERE info1.price != info2.price

És ad ez az eredmény:

+----+--------------+-------+---------------------+----+--------------+-------+---------------------+
| id | product_code | price | price_date          | id | product_code | price | price_date          |
+----+--------------+-------+---------------------+----+--------------+-------+---------------------+
|  4 | P01          | 15.00 | 2019-01-09 00:00:00 |  3 | P01          | 20.00 | 2019-01-05 00:00:00 |
| 11 | P04          | 25.00 | 2019-01-05 00:00:00 | 10 | P04          | 15.00 | 2019-01-02 00:00:00 |
+----+--------------+-------+---------------------+----+--------------+-------+---------------------+
Válaszolt 10/10/2019 22:00
a forrás felhasználó

szavazat
0

Ez úgy néz ki, mint a természetes használat esetében ablak funkció LAG(), amely elérhető a MySQL 8.0:

SELECT product_code, price, price_date 
FROM (
    SELECT
        t.*,
        LAG(price) OVER(PARTITION BY product_code ORDER BY price_date) lag_price
    FROM PriceHistory t
) x WHERE price != lag_price

Demo DB hegedű - úgy néz ki, vannak discrepencies a várt eredményeket, hogy megmutattad, de ez úgy tűnik, mint a megfelelő kimeneti alapján én megértése a kérdést:

| product_code | price | price_date          |
| ------------ | ----- | ------------------- |
| P01          | 15    | 2019-01-03 00:00:00 |
| P01          | 20    | 2019-01-05 00:00:00 |
| P01          | 15    | 2019-01-09 00:00:00 |
| P02          | 15    | 2019-01-06 00:00:00 |
| P04          | 25    | 2019-01-05 00:00:00 |
Válaszolt 10/10/2019 00:57
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more