选择以周分隔的记录实例数量

时间:2014-06-24 14:59:33

标签: mysql

我有一张如下表:

CompanyID |  Logged      | UniqueID
A         |  2014-06-24  | 8
B         |  2014-06-24  | 7
A         |  2014-06-16  | 6
B         |  2014-06-16  | 5
A         |  2014-06-08  | 4
B         |  2014-06-08  | 3
A         |  2014-06-01  | 2
B         |  2014-06-01  | 1

我试图创建一个SQL语句,该语句将返回为每个唯一的CompanyID找到的行数,分为4周时段,如下所示:

CompanyID | Period (week)  | Quantity
A         | 0              | 1
B         | 0              | 1
A         | 1              | 1
B         | 1              | 1
A         | 2              | 1
B         | 2              | 1
A         | 3              | 1
B         | 3              | 1

我之前做过类似的事情,除了过去7天而不是过去4周,但我不确定这是否可以重做:

select CompanyID, 
case DATE_FORMAT(Logged, '%Y%m%d') 
when '20140618' then '0' 
when '20140619' then '1' 
when '20140620' then '2' 
when '20140621' then '3' 
when '20140622' then '4' 
when '20140623' then '5' 
when '20140624' then '6' 
end as period , 
count(UniqueID) as quantity from TABLE
where DATE_FORMAT(Logged, '%Y%m%d') 
in (20140618,20140619,20140620,20140621,20140622,20140623,20140624) group by CompanyID, 
DATE_FORMAT(Logged, '%Y%m%d')

是否有更简单的方法来获得上述所需的输出?

1 个答案:

答案 0 :(得分:0)

也许是这样的? SQL FIDDLE使用

进行测试

Theres原始查询不使用任何硬编码...这通常是一个非常糟糕的做法。它将计数膨胀为1,因为它从一开始,你希望它从零开始,所以要解决这个原始查询的select,你修复计数,然后也不显示用户定义的变量

SELECT CompanyID, Period - 1 as Period, Quantity FROM(
SELECT 
  CompanyID,
  if(@a = Logged, @b, @b := @b + 1) as Period,
  COUNT(*) as Quantity,
  @a := Logged
FROM test
JOIN (SELECT @a := '', @b := 0) as temp
GROUP BY UniqueID
ORDER BY Period
) as subQuery

ORIGINAL QUERY

SELECT 
  CompanyID,
  if(@a = Logged, @b, @b := @b + 1) as Period,
  COUNT(*) as Quantity,
  @a := Logged
FROM test
JOIN (SELECT @a := '', @b := 0) as temp
GROUP BY UniqueID
ORDER BY Period