0

この質問のタイトルの書き方はわかりませんが、必要なのはN、特定の値を持つレコードを返すクエリです。

私が持っているテーブルは520万レコードを超えています

レコードは次のようになります。

  • セッション(文字列、プライマリインデックス)
  • customer_id(int、インデックス付き)
  • クリック数(int、インデックス付き)
  • order_number(int、インデックス付き)
  • date_entry(datetime、インデックス付き)
  • 他の多くの分野

私が知る必要があるのは、注文する前に同じ顧客がサイトにログインした回数(異なるセッション)です(そのセッション中に注文が行われない限り、order_numberは0です)

サンプルデータは次のようになります(データの簡略化)

セッション| c_id | クリック数| ord_num | エントリー|
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 |
コッド| 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-1つのセッションのみのcustomer1
  • 2sess-2セッションのお客様
  • 3sess-3セッションのお客様
  • 4sess-4セッションのお客様
  • more4sess-4セッションを超えるお客様
  • order1sess-最初のセッションで注文した顧客
  • order2sess-2番目のセッションで注文した顧客
  • order3sess-3番目のセッションで注文した顧客
  • order4sess-4番目のセッションで注文した顧客
  • orderMore4Sess-4回目のセッション後に注文した顧客
エントリ|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が解除されます。

私はそれが理にかなっていることを願っています

4

1 に答える 1

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でそれを参照してください。

于 2012-10-02T19:42:55.620 に答える