sql >> Databáze >  >> RDS >> Mysql

SQL, jak odečíst výsledek řádek 1 od řádku 2, řádek 2 od řádku 3

Pravděpodobně se budete chtít podívat do proměnných definovaných uživatelem a pak pravděpodobně budete chtít udělat něco takového:

SET @prev := NULL;
SELECT
    DATE(created_at),
    price - COALESCE(@prev, price) AS price_change,
    name,
    (@prev := price) AS price FROM (
        SELECT * FROM items ORDER BY DATE(created_at)
    ) t1
GROUP BY
    name, price, DATE(created_at)
HAVING name = 'Ibuprofen'
ORDER BY DATE(created_at);
Query OK, 0 rows affected (0.00 sec)

Nezkontroloval jsem syntaxi, takže to může být trochu mimo, ale to je obecná myšlenka. Všimněte si, že jsem přidal datum, abyste podle něj mohli objednávat, jinak mohou výsledky postrádat smysl.

EDIT:

Právě jsem spustil toto na mém počítači:

SET @prev := NULL;
SELECT
    DATE(created_at),
    price - COALESCE(@prev, price) AS price_change,
    name,
    (@prev := price) AS price FROM (
        SELECT * FROM items ORDER BY DATE(created_at)
    ) t1
GROUP BY
    name, price, DATE(created_at)
HAVING name = 'Ibuprofen'
ORDER BY DATE(created_at);

Query OK, 0 rows affected (0.00 sec)

+------------------+--------------+-----------+-------+
| DATE(created_at) | price_change | name      | price |
+------------------+--------------+-----------+-------+
| 2018-12-10       |            0 | Ibuprofen |   110 |
| 2018-12-13       |          -10 | Ibuprofen |   100 |
| 2018-12-13       |           20 | Ibuprofen |   120 |
+------------------+--------------+-----------+-------+

3 rows in set, 1 warning (0.00 sec)

SELECT * FROM items;
+----+-------+----------------+---------------------+
| id | price | name           | created_at          |
+----+-------+----------------+---------------------+
|  8 |   100 | Ibuprofen      | 2018-12-13 12:52:35 |
|  9 |   110 | Ibuprofen      | 2018-12-10 12:12:12 |
| 10 |   120 | Ibuprofen      | 2018-12-13 12:52:35 |
| 11 |  1000 | Something else | 2018-12-13 13:01:19 |
+----+-------+----------------+---------------------+

4 rows in set (0.00 sec)


  1. Chyba serveru SQL Server Implicitní převod, protože řazení hodnoty není vyřešeno kvůli konfliktu řazení.

  2. chyba mysql 5.7 log-slow-queries

  3. Indexujte databázi MySQL pomocí Apache Lucene a udržujte je synchronizované

  4. jak získat počáteční a koncové datum všech týdnů mezi dvěma daty na serveru SQL?