önceki değerleri değişti Seç kayıtları

oy
0

Ben bir katalog (başka tablo) ürünlerin fiyatının geçmişini kayıt bir tablo var.

Ben ürünlerin fiyatları değişti ne sadece tespit etmek gerekir böylece herhangi ürünün fiyatı her an değişebilir. Mesela ben bu tablo vardır:

+----+--------------+-------+---------------------+
| 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 |
+----+--------------+-------+---------------------+

ve ben bu sonucu gerekir:

+--------------+-------+---------------------+
| 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 |
+--------------+-------+---------------------+

ve bu istisnalar şunlardır:

Ben (ardışık evet, aynı fiyat kaydedilebilir birden çok kez) bunu görmezden böylece P02 fiyatı değişmedi

P03 sadece 1 kayıt var, bu yüzden teknik olarak fiyatı değişmedi, bu yüzden bunu görmezden (bu çok nadirdir fakat bazı ürünler fiyatlarını asla değişmez)

Bunu görmezden böylece P05 fiyatı değişmedi

Kolayca okumak için ama teknik veriler herhangi bir sırada olabilir sırayla bu verileri koydu.

Eğer çok fazla zaman kaybetmeyin o yüzden sana geçecektir:

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');

Şimdiden teşekkürler.

Oluştur 10/10/2019 saat 00:50
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
0

Onun değil kesin cevabı ben her satırda sonuçları bekliyoruz ama bu cevap yeterince iyi ve işler halletmek çünkü kesin:

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

Ve bu sonucu verir:

+----+--------------+-------+---------------------+----+--------------+-------+---------------------+
| 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 |
+----+--------------+-------+---------------------+----+--------------+-------+---------------------+
Cevap 10/10/2019 saat 22:00
kaynak kullanıcı

oy
0

Bu pencere fonksiyonu için doğal bir kullanım durumunda benziyor LAG()MySQL 8.0, mevcut:

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

DB Fiddle üzerinde Demo - orada gösterdi beklenen sonuçlarında discrepencies vardır, ama bu senin sorunun benim anlayışa dayalı doğru çıktı gibi görünüyor gibi görünüyor:

| 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 |
Cevap 10/10/2019 saat 00:57
kaynak kullanıcı

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