簡體   English   中英

mysql行之間的區別

[英]Difference between mysql rows

我有一個mysql表,它是這樣的:

date               product ID    sold
-----              ----------    ----
2013-04-20 09:00   ABC           10
2013-04-20 09:00   DEF           15
2013-04-20 09:00   HIJ           15
2013-04-20 10:00   ABC           5
2013-04-20 10:00   DEF           10
2013-04-20 10:00   HIJ           20
and so on..

我想得出每小時銷售的每件產品的數量之間的差異,按降序差異排序,因此上述結果將是:

2013-04-20 10:00   HIJ           5
2013-04-20 10:00   ABC           -5
2013-04-20 10:00   DEF           -5

我嘗試了一些事情,比如加入桌子,但我無法做到。 我該怎么做呢?

你可以使用這樣的查詢:

SELECT t.date, t.productID, t.sold-tp.sold
FROM (
  SELECT t1.date, t1.productID, t1.sold, MAX(t2.date) date_prec
  FROM
    yourtable t1 INNER JOIN yourtable t2
    ON t1.productID=t2.productID AND t1.date>t2.date
  GROUP BY
    t1.date, t1.productID, t1.sold) t INNER JOIN yourtable tp
  ON t.productID=tp.productID and t.date_prec=tp.date

請看這里的小提琴。

在子查詢中,我正在使用相同的產品ID和條件t1.date>t2.date 按t1.date,productID分組並出售,您可以獲得之前的日期時間,即MAX(t2.date) 然后我再次與yourtable加入這個子查詢,以獲得前一天的sold價值。

編輯

您可能還想使用此:

SELECT t.date, t.productID, t.sold-tp.sold
FROM
  yourtable t INNER JOIN yourtable tp
  ON t.productID = tp.productID
     AND t.date = tp.date + INTERVAL 1 HOUR

在這里,我將返回前一小時的soldsold之間的差額。

小提琴就在這里

臨時表很容易。 首先通過以下方式總結您的數據:

CREATE TABLE sales_summary
(
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    product_id CHAR(3) NOT NULL,
    date DATETIME NOT NULL,
    sold INT NOT NULL
)
SELECT
    NULL AS id,
    product_id,
    DATE_FORMAT(date, '%Y-%m-%d %H:00:00') date,
    SUM(sold) AS sold
FROM
    sales
GROUP BY
    product_id,
    DATE_FORMAT(date, '%Y-%m-%d %H:00:00')
ORDER BY
    1,2;

從該摘要表中,您可以創建報告:

SELECT
    b.product_id,
    a.date AS prev_hour,
    b.date AS this_hour,
    b.sold - a.sold AS diff_sold,
    a.sold AS prev_sold,
    b.sold AS this_sold
FROM
    sales_summary a
INNER JOIN
    sales_summary b ON b.id = a.id + 1 AND b.product_id = a.product_id 
ORDER BY
    a.product_id,
    a.date DESC;

返回:

+------------+---------------------+---------------------+-----------+-----------+-----------+
| product_id | prev_hour           | this_hour           | diff_sold | prev_sold | this_sold |
+------------+---------------------+---------------------+-----------+-----------+-----------+
| ABC        | 2013-04-20 10:00:00 | 2013-04-20 11:00:00 |        40 |        10 |        50 |
| ABC        | 2013-04-20 09:00:00 | 2013-04-20 10:00:00 |       -10 |        20 |        10 |
| DEF        | 2013-04-20 09:00:00 | 2013-04-20 10:00:00 |       -10 |        30 |        20 |
| HIJ        | 2013-04-20 09:00:00 | 2013-04-20 10:00:00 |        10 |        30 |        40 |
+------------+---------------------+---------------------+-----------+-----------+-----------+

一個工作示例位於http://sqlfiddle.com/#!2/897d9/1/0

這可以通過相關子查詢簡單地完成,盡管它在大型表上可能效率不高:

select `date`, `productId`, ifnull(sold-(
  select sold
  from sales i
  where i.date < s.date
  and i.productId = s.productId
  limit 1
), sold) as diff
from sales s;

需要注意的是:該查詢以及其他答案中的其他問題依賴於一件事:表中的數據已按小時分組,在大多數情況下情況並非如此。

這是小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM