获取一天的独特记录,但在日期范围内多次计算

时间:2013-10-04 21:45:57

标签: mysql sql

我正在查询我正在搜索订单号的查询。我需要过滤当天唯一的订单号。为此,我在主查询中使用count(distinct order_number)。此查询从前端获取开始日期和结束日期并使用它们。但是我有一个问题,如果在该范围内有2天相同的order_number,它将被计算在两个日期。即 计算一天中唯一订单的数量。最初我想在日期上使用一些循环并对结果求和,但这对我来说并不合适。我更感兴趣的是使用相同的查询并根据日期修改不同的订单。这是我的疑问:

SELECT 'site1' AS site,
  DATE_FORMAT(l.login_time, '%m/%d/%Y') AS DATE,
  COUNT(DISTINCT osh.order_num) AS total_orders
FROM order_history o
INNER JOIN logs l ON o.userID = l.id
WHERE o.date_time BETWEEN 1380524400 AND 1380610799
  AND l.LOGIN BETWEEN FROM_UNIXTIME(1380524400) AND FROM_UNIXTIME(1380610799)
GROUP BY DATE

示例

假设日期29Aug,我有订单o1,o2,o1,o3,o2我将它们计为3个不同的订单,即o1,o2,03 8月30日,我有订单o1,o4,o4,o1我将它们视为2个不同的订单,即o1,o4

但是当我查询29-30时,我必须得到3 + 2 = 5的计数,即o1在sicne范围内计算两次,它属于两个差异日期。

1 个答案:

答案 0 :(得分:2)

我认为在这种情况下,WITH ROLLUP修饰符可能会服务于您的目的

SELECT 'site1' AS site,
  DATE_FORMAT(l.login_time, '%m/%d/%Y') AS `DATE`,
  COUNT(DISTINCT osh.order_num) AS total_orders
FROM order_history o
INNER JOIN logs l ON o.userID = l.id
WHERE o.date_time BETWEEN 1380524400 AND 1380610799
  AND l.LOGIN BETWEEN FROM_UNIXTIME(1380524400) AND FROM_UNIXTIME(1380610799)
GROUP BY `DATE` WITH ROLLUP

这将在数据末尾添加一个额外的行,该行将total_orders数据相加(DATE的值为NULL)

以下是有关此修饰符的文档:http://dev.mysql.com/doc/refman/5.5/en/group-by-modifiers.html