2015-09-10 35 views
0

鉴于以下数据:如何根据日期列来计算注册流量?

| id | region | name | date    | 
|100 | 50  | JHONY | 2015-08-21 13:00:00| 
|101 | 58  | JHONY | 2015-08-21 14:03:55| 
|102 | 58  | JHONY | 2015-08-21 14:03:59| 
|103 | 50  | MARY | 2015-08-21 13:02:00| 
|104 | 40  | JHONY | 2015-08-21 14:04:15| 
|105 | 50  | JHONY | 2015-08-21 14:05:01| 
|106 | 58  | MARY | 2015-08-21 14:10:55| 
|107 | 50  | JHONY | 2015-08-21 14:30:00| 
|108 | 58  | JHONY | 2015-08-21 15:00:00| 

我需要知道玛丽和Jhony的交通两个指定区域之间。是否有可能通过SQL获得它,看起来像下面的结果?

JHONY, 2 
MARY, 1 

因此,它表示我有三个从50到58的动作。 Jhony已经从50次增加到58次(id 100/101和id 107/108),而Mary从50次移到58次(id 103/106),忽略了重复数据并考虑了日期流程(并考虑了其他可能的名称)。

回答

1
select name, count(*) 
    from 
     (select t1.name, t1.region f, t2.region t 
      from t t1 
      left join 
       t t2 
      on t1.date < t2.date and t1.name=t2.name 
     where t1.name='JHONY' 
     group by t1.id) t3 
    where f=50 and t=58 

Demo on sqlfiddle

UPDATE

select name, count(*) 
    from 
     (select t1.name, t1.region f, t2.region t 
      from t t1 
      left join 
       t t2 
      on t1.date < t2.date and t1.name=t2.name 
     group by t1.name, t1.id 
    ) t3 
    where f=50 and t=58 
    group by name 
+0

它工作正常,但在这个例子中(http://sqlfiddle.com/#!2/f17be/2),我添加了WHERE子句并且不能正常工作,为什么不呢?查询应忽略记录#107和结果2计数,而不是3. – dellasavia

+0

我找到了解决方案,我将其更改为'where t1.date like'2015-08-22%'and t2.date like'2015-08- 22%'' – dellasavia

+0

有时候我面对这样一个复杂的问题,我收到一个非常高的答案,可以解决这个问题......但不幸的是,它很少受到关注,很少有人有类似的问题,因此得到的分数较少。另一方面,有更简单的问题可以获得数百分。这是不公平的... – dellasavia

0

也许是这样的:

SELECT name, COUNT(DISTINCT region)-1 as region_changes 
FROM `table` 
WHERE `date` BETWEEN '2015-08-21 13:00:00' AND '2015-08-21 15:00:00' 
GROUP BY name 

DEMO:http://sqlfiddle.com/#!9/898ff/5

1

您可以通过多种方式获得过去的区域。这里是一个:

select t.*, 
     (select t2.region 
     from table t2 
     where t2.name = t.name and t2.date < t.date 
     order by t2.date desc 
     limit 1 
     ) as prev_region 
from table t; 

然后,您可以添加你的条件是:由于问题的更新

select name, count(*) 
from (select t.*, 
      (select t2.region 
       from table t2 
       where t2.name = t.name and t2.date < t.date 
       order by t2.date desc 
       limit 1 
      ) as prev_region 
     from table t 
    ) t 
where prev_region = 50 and region = 58 
group by name; 
+0

你r查询工作正常,当我想看到50和58之间的流量,但反之亦然,从58到50,什么会得到结果'JHONY 1'(id 102和104)。可能吗? – dellasavia

+0

实际上,我想列出在50到58之间旅行的所有名字,不仅仅是JHONY ...并且它不需要列出名称,只是出现交通。在这种情况下,数字2就足够了。如果我有其他'名字'在50到58之间旅行(例如MARY),它会是3等等......(对不起,我更新了这个问题) – dellasavia

+1

@dellasavia。 。 。在这种情况下,从'select'中删除最后的'group by'子句和'name'。 –