2016-11-27 61 views
1

我有2个表:从一个表中选择新的日期与集团其他表通过

订单

  • PURCHASE_DATE(这是输入 '日期时间')
  • ITEM_PRICE
  • SKU
  • 其他数据

total_sales_by_date

  • 日期
  • TOTAL_SALES

的订单表得到更新由API每天的基础上。 total_sales_by_date表仅将每个sku上的所有销售额相加,并按日期将它们按照该日期的所有skus /销售额的SUM总计进行分组。我使用这个查询:

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

对于数据库的效率,我想更新只通过API走进1台新的销售数据每天都在2号桌。即 - 我不想重新插入我已经在第二个表中的旧数据。

此外,我想创建一个过程,每天凌晨4点运行(或其他)。

回答

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获取它们。如果您在orders表上的(purchase_date, item_price)上定义了复合索引,则使用该视图不应该太过于性能影响。

+0

哇。这很有趣。所以最终的游戏是在Excel中或在基于Web的平台中绘制这些东西。考虑到这一点,将使用视图然后在服务器上创建更多的资源,而不是简单地下载以前填充的表格? – user800507

+0

我想你的意思是消耗更多的资源。 (我希望查询可以创建更多的资源。:-) :-)不是很明显,除非你一小时多次运行这个图表程序,并且你的'orders'表中至少有100,000行。无论如何,通常的做法是使用简单的SQL工具(查询,视图等)来完成工作。如果你发现你有性能问题,那么你添加索引。如果这不起作用,你可以使用你在这里展示的大锤 - 物化视图。 –

+0

您的策略是利用您的时间(唯一不可替代的资源)来克服您认为会成为MySQL服务器的瓶颈。除非你确定瓶颈是真实的,否则没有任何意义。它可能不是。 –

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; 
相关问题