【问题标题】:MySQL group by where day <= xMySQL group by where day <= x
【发布时间】:2012-10-19 09:36:15
【问题描述】:

我需要一些帮助来找出正确的 SQL 语句。

如果有一个具有以下结构的表: id、product_id、单位、时间戳

我不想要一个包含每天所有单位的列表。一个产品每天最多有一条记录。 所以我的第一次尝试是:

SELECT 
    DATE(timestamp) as day, SUM(units) as overall_units 
FROM 
    tbl 
GROUP BY 
    DATE(timestamp);

通常应该这样做。但有时也有没有产品记录的日子。尽管如此,这些单位仍在仓库中,因此它们应该在计算中。

例如:

我们有 3 种产品。汽车、钢笔和轮子。 2012-10-20 的记录:

汽车 => 5 笔 => 20 轮子 => 4

2012-10-21 的记录 汽车 => 5 轮子 => 6

我的查询将给出以下结果:

2012-10-20 => 29

2012-10-21 => 11

但我想,如果当天没有产品记录,它应该使用该产品的记录,该记录是最接近时间的。

应该是这样的:

2012-10-21 => 31

我希望你能理解我的需要。

【问题讨论】:

    标签: mysql sql join group-by sum


    【解决方案1】:
    SELECT 
       MAX (DATE(timestamp) ) as day, SUM(units) as overall_units 
    FROM tbl
    

    更新 ::

     SELECT max(day),sum(ou) from  
         (  select DATE(timestamp) as day, SUM(units) as ou 
            FROM tbl 
            GROUP BY   DATE(timestamp);
          )
    

    内部 qry 将返回

    2012-10-20 , 29
    2012-10-21 , 11
    

    最终查询会返回

     2012-10-21 , 40
    

    【讨论】:

    • 但这似乎不适用于GROUP BY DATE(timestamp)
    【解决方案2】:
    SELECT 
        dd.ddate AS day
      , SUM(t.units) as overall_units 
    FROM
            ( SELECT DISTINCT
                  product_id
              FROM 
                  tbl
            ) AS dp
        CROSS JOIN
            ( SELECT DISTINCT
                  DATE(timestamp) AS ddate
              FROM 
                  tbl
            ) AS dd
        JOIN 
            tbl AS t
                ON t.id =
                    ( SELECT
                          tt.id
                      FROM
                          tbl AS tt
                      WHERE 
                          tt.product_id = dp.product_id
                        AND
                          tt.timestamp < dd.ddate + INTERVAL 1 DAY
                      ORDER BY tt.timestamp DESC
                        LIMIT 1
                    ) 
    GROUP BY 
        dd.ddate ;
    

    【讨论】:

      【解决方案3】:

      我认为您应该研究DISTINCT() 函数。 查询可能类似于:SELECT DISTINCT(product_id), * FROM tbl ORDER BY timestamp DESC; 使用 PHP 循环遍历您的结果并累积单位。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多