从一个表中选择新日期到另一个具有分组依据的表

时间:2016-11-27 21:11:30

标签: mysql datetime aggregate-functions

我有两张桌子:

订单

  • purchase_date(此类型为'datetime')
  • ITEM_PRICE
  • SKU
  • misc其他数据

total_sales_by_date

  • 日期
  • TOTAL_SALES

订单表每天都会通过API进行更新。 total_sales_by_date表仅将每个sku中的所有销售额相加,并按日期对它们进行分组,并在该日期对所有skus / sales进行总计。我正在使用此查询:

INSERT INTO total_sales_by_date SELECT DATE(purchase_date) AS date, SUM(item_price) AS total_sales FROM orders GROUP BY date

为了提高数据库效率,我想每天只更新第二个表,只包含API第一个表中的新销售数据。即 - 我不想重新插入我已经在第二个表中的旧数据。

此外,我想创建一个程序,每天早上4点(或其他)运行。

2 个答案:

答案 0 :(得分:0)

如果您在每天当地时间午夜后的某个时间运行以下查询,您将获得所需内容。我建议在凌晨3点之后运行它,这样你就不会在夏令时开始或结束的日子里出现异常。

INSERT INTO total_sales_by_date 
SELECT DATE(purchase_date) AS date, 
       SUM(item_price) AS total_sales
  FROM orders
 WHERE purchase_date >= CURDATE() - INTERVAL 1 DAY
   AND purchase_date < CURDATE()
 GROUP BY DATE(purchase_date)

选择昨天的销售,汇总它们,并将它们插入到您的total_sales表中。您可以使用MySQL event运行它。这是一个explanation of the event scheduler

但是你可能会采取艰难的方式做事,在那里你可以更容易。您的total_sales表有时被称为“物化视图”。也就是说,它完全来自其他一些表,并且不包含其他信息。您可以通过将其定义为普通视图来完全取消定期更新它的业务。

    CREATE OR REPLACE VIEW total_sales
    AS
    SELECT DATE(purchase_date) AS date, 
           SUM(item_price) AS total_sales
      FROM orders
     GROUP BY DATE(purchase_date)

然后,只要您需要来自total_sales的行,MySQL就会从orders获取它们。如果您在(purchase_date, item_price)表上的orders上定义复合索引,则使用该视图不应过多地影响性能。

答案 1 :(得分:0)

您可以使用这样的查询。你可以运行你想要的频率。它只向昨天插入订单,并从total_sales_by_date

中检查最大日期
INSERT INTO total_sales_by_date (date,total_sales)
SELECT
    DATE(purchase_date) AS date,
    SUM(item_price) AS total_sales
  FROM orders
  where ( 
    SELECT IF( max(date) is null,'1900-01-01',max(date) + interval 1 day)
    FROM total_sales_by_date
    ) < purchase_date
  AND purchase_date < date(now() - interval 1 day)
  GROUP BY date;