MySQL查询按周计算当前52周的项目?

时间:2012-03-24 01:34:40

标签: mysql sql date calendar

我有一个查询,我想要更改,以便它为我提供当前 52周的计数。此查询使用我制作的日历表,其中包含固定范围内的日期列表。现在的查询是选择最大和最小日期,而不一定是过去52周。

我想知道如何让我的日历表保持最新状态,以便我可以获得最后52周(即从现在到一年前)。或者是否有另一种方法使查询独立于使用日历表?

以下是查询:

SELECT calendar.datefield AS date, IFNULL(SUM(purchaseyesno),0) AS item_sales
FROM items_purchased join items on items_purchased.item_id=items.item_id 
RIGHT JOIN calendar ON (DATE(items_purchased.purchase_date) = calendar.datefield)
WHERE (calendar.datefield BETWEEN (SELECT MIN(DATE(purchase_date)) 
FROM items_purchased) AND (SELECT MAX(DATE(purchase_date)) FROM items_purchased)) 
GROUP BY week(date)

想法?

2 个答案:

答案 0 :(得分:1)

有些人不喜欢这种方法,但我倾向于使用包含0 - 1000值的虚拟表,然后使用派生表生成所需的范围 -

CREATE TABLE dummy (`num` INT NOT NULL);
INSERT INTO dummy VALUES (0), (1), (2), (3), (4), (5), .... (999), (1000);

如果你的表有一个自动递增的id和大量的行,你可以从中生成它 -

CREATE TABLE `dummy`
SELECT id AS `num` FROM `some_table` WHERE `id` <= 1000;

请记住插入0值。

SELECT CURRENT_DATE - INTERVAL num DAY
FROM dummy
WHERE num < 365

因此,将此方法应用于您的查询,您可以执行以下操作 -

SELECT WEEK(calendar.datefield) AS `week`, IFNULL(SUM(purchaseyesno),0) AS item_sales
FROM items_purchased join items on items_purchased.item_id=items.item_id 
RIGHT JOIN (
    SELECT (CURRENT_DATE - INTERVAL num DAY) AS datefield
    FROM dummy
    WHERE num < 365
) AS calendar ON (DATE(items_purchased.purchase_date) = calendar.datefield)
WHERE calendar.datefield >= (CURRENT_DATE - INTERVAL 1 YEAR)
GROUP BY week(datefield) -- shouldn't this be datefield instead of date?

答案 1 :(得分:1)

我通常使用@sql变量动态“模拟”一个表,然后只需加入系统中任意时间最短至少所需数周的表。注意......在处理日期时,我喜欢通常只使用日期部分,这意味着上午12:00:00。此外,通过将“EndOfWeek”的开始日期提前7天,您现在可以在给定时间段内为记录应用BETWEEN子句...例如您的每周需求。

我已经应用了这样一个样本来协调基于日期关联的联接到每周......自从你

select 
      DynamicCalendar.StartOfWeek,
      COALESCE( SUM( IP.PurchaseYesNo ), 0 ) as Item_Sales
   from 
      ( select
              @weekNum := @weekNum +1 as WeekNum,
              @startDate as StartOfWeek,
              @startDate := date_add( @startDate, interval 1 week ) EndOfWeek
           from 
              ( select @weekNum := 0,
                       @startDate := date(date_sub(now(), interval 1 year ))) sqlv,
              AnyTableThatHasAtLeast52Records,
           limit
             52 ) DynamicCalendar
      LEFT JOIN items_purchased IP
         on IP.Purchase_Date bewteen DynamicCalendar.StartOfWeek 
                            AND DynamicCalendar.EndOfWeek
   group by
      DynamicCalendar.StartOfWeek

这是在您的“PurchaseYesNo”值直接在您购买的表中的前提下。如果是这样,则无需加入ITEMS表。如果在项目表中的字段是IS,那么我只需要对你的项目表进行LEFT JOIN并从中获取价值。

但是,您可以在很多条件下使用dynamicCalendar上下文。