2012-10-02 42 views
0

我不知道如何写这个问题的标题,但我需要的是一个查询,返回具有特定值的N记录是什么。查询数据库找到第N个记录

我拥有的桌子已超过5个。2M记录

中的记录是类似于:

  • 会话(字符串,主索引)
  • CUSTOMER_ID(INT,索引)
  • 点击(INT,索引)
  • ORDER_NUMBER(INT,索引)
  • date_entry(datetime,索引)
  • 许多其他字段

什么,我需要知道的是相同的客户多少次登录到该网站(不同的会话)在订购前(ORDER_NUMBER是0,除非订单被该届会议期间放置)

的样本数据可以(简化数据)

 
session | c_id | clicks | ord_num |   entry  | 
abc  | 123 | 2 | 0  | 2012-08-01 00:00:00 | 
cde  | 456 | 2 | 0  | 2012-08-01 00:00:01 | 
efg  | 457 | 2 | 0  | 2012-08-01 00:00:02 | 
hij  | 123 | 5 | 0  | 2012-08-01 00:00:03 | 
kod  | 986 | 10 | 0  | 2012-08-01 00:00:04 | 
wdg  | 123 | 2 | 9876 | 2012-08-01 00:00:05 | 
qwe  | 123 | 2 | 0  | 2012-08-01 00:00:06 | 
wvr  | 986 | 12 | 8656 | 2012-08-01 00:00:07 | 

我要的是一个查询,显示了类似于:

  • 项 - 日期输入
  • 个tot_sess - 会话总数
  • tot_cust - 客户总数
  • 1sess - customer1表只有一个区段
  • 2sess - 客户与2届
  • 3sess - 客户3届
  • 4sess - 客户与4届
  • more4sess - 客户提供超过4届
  • order1sess - 客户,关于第一届会议下令
  • 个order2sess - 即第二届订购客户
  • order3sess - 即第三届会议下令客户
  • order4sess - 即第四届会议下令客户
  • orderMore4Sess - 客户第四届会议后,下令
 
entry   |tot_sess|tot_cust| 1sess | 2sess | 3sess | 4sess | more4sess | order1sess | order2sess | order3sess | order4sess | orderMore4Sess | 
2012-08-01 | 8 | 4 | 2 | 1 | 0 | 1 | 0  |  0 | 1  |  1  |  0  |  0   | 

我已经能够获得有关与下面的查询会话的信息:

SELECT 
    t.`date_entry`, 
    COUNT(sess) `cust`, 
    SUM(sess) `session`, 
    COUNT(IF(sess>1,sess,NULL)) `more than once`, 
    COUNT(IF(sess=1,sess,NULL)) `one`, 
    COUNT(IF(sess=2,sess,NULL)) `two`, 
    COUNT(IF(sess=3,sess,NULL)) `three`, 
    COUNT(IF(sess=4,sess,NULL)) `four`, 
    COUNT(IF(sess>4,sess,NULL)) `more`, 
    ROUND(COUNT(IF(sess>1,sess,NULL))/COUNT(sess),2) `perc > 1`, 
    ROUND(COUNT(IF(sess>2,sess,NULL))/COUNT(sess),2) `perc > 2`, 
    ROUND(COUNT(IF(sess>3,sess,NULL))/COUNT(sess),2) `perc > 3`, 
    ROUND(COUNT(IF(sess>4,sess,NULL))/COUNT(sess),2) `perc > 4` 
FROM 
(
SELECT 
    `customer_id`, 
    COUNT(`session`) `sess`, 
    DATE(`date_entry`) `date_entry` 
FROM `customer_activity_log` 
WHERE 
    `clicks` > 1 
    AND `customer_id` > 0 
    AND `date_entry` > '2012-08-01' 
    AND subsite_id <=1 
GROUP BY `date_entry`, `customer_id` 
) t 
GROUP BY date_entry 

一旦我有了这些,我还需要以不同的方式查看数据,例如,如果客户123在2012-01-01第一次显示,然后又回来了15次,并将订单放置在2012年-08-01,然后又回来了5次,并在2012-10-12又下了一个订单,我将需要一个查询,不会受约会日期的约束,但仅限于客户,换句话说,约束date_entry将被删除

我希望它是有道理的

回答

2
SELECT e    AS entry, 
     SUM(sessions) AS tot_sess, 
     COUNT(*)  AS tot_cust, 
     SUM(sessions=1) AS 1sess, 
     SUM(sessions=2) AS 2sess, 
     SUM(sessions=3) AS 3sess, 
     SUM(sessions=4) AS 4sess, 
     SUM(sessions>4) AS more4sess, 
     SUM(orders =1) AS order1sess, 
     SUM(orders =2) AS order2sess, 
     SUM(orders =3) AS order3sess, 
     SUM(orders =4) AS order4sess, 
     SUM(orders >4) AS orderMore4Sess 
FROM (
    SELECT b.e, b.c_id, b.sessions, COUNT(a.entry) AS orders 
    FROM customer_activity_log a RIGHT JOIN (
    SELECT DATE(entry) AS e, c_id, COUNT(*) AS sessions, 
      MIN(IF(ord_num=0,NULL,entry)) AS o 
    FROM  customer_activity_log 
    GROUP BY e, c_id 
) b ON a.c_id = b.c_id AND DATE(a.entry) = b.e AND a.entry <= b.o 
    GROUP BY b.e, b.c_id 
) t 

请参阅sqlfiddle

+0

谢谢。我将不得不努力工作并尝试加快速度,但这是一个很好的问题。 – Fabrizio