SQL 服务器子 queries/Join 基于值的计数

SQL Server Sub queries/Join Count Based on values

请帮我解决这个问题:

我在Table中有以下数据:

Menu                    dateTime                  CLI

START                   2016-02-23 14:08:52.047   4001
WELCOME                 2016-02-23 14:08:52.047   4001
LANG_SEL                2016-02-23 14:08:52.047   4001
SERVICE_MENU            2016-02-23 14:08:52.047   4001
CUSTOMER_ACCOUNT        2016-02-23 14:08:52.047   4001
BILLING_MENU            2016-02-23 14:08:52.047   4001
STOP                    2016-02-23 14:08:52.047   4001
START                   2016-02-23 14:08:52.047   2000
WELCOME                 2016-02-23 14:08:52.047   2000
LANG_SEL                2016-02-23 14:08:52.047   2000
BILLING_MENU            2016-02-23 14:08:52.047   2000
STOP                    2016-02-23 14:08:52.047   2000
START                   2016-02-23 14:08:52.047   34543
WELCOME                 2016-02-23 14:08:52.047   34543
LANG_SEL                2016-02-23 14:08:52.047   34543
SERVICE_MENU            2016-02-23 14:08:52.047   34543
BillComplaintSelection  2016-02-23 14:08:52.047   34543
VerbalizeBilltkt        2016-02-23 14:08:52.047   34543
STOP                    2016-02-23 14:08:52.047   34543
START                   2016-02-23 14:08:52.047   4001
WELCOME                 2016-02-23 14:08:52.047   4001
LANG_SEL                2016-02-23 14:08:52.047   4001
BILLING_MENU            2016-02-23 14:08:52.047   4001
VerbalizebillDetails    2016-02-23 14:08:52.047   4001
BILLING_MENU            2016-02-23 14:08:52.047   4001
STOP                    2016-02-23 14:08:52.047   4001

我的会话以值 START 开始,以值 STOP 结束我想计算菜单名称在 每天停止

就像上面的数据一样,我必须得到以下输出:

Menu                        Count     DateTime

BILLING_MENU                3        2016-02-23 14:08:52.047
VerbalizeBilltkt            1        2016-02-23 14:08:52.047

这可能会回答您的问题...

SELECT ID, COUNT(ID) AS TotalCount, -- You cannot use count as a field name CAST(DateTime AS DATE) AS DateOnly FROM TableName WHERE ID <> 'Start' or ID <> 'Stop' GROUP BY ID, CAST(DateTime AS DATE)

假设 dateTime 字段包含按升序排列的离散日期时间值,您可以使用以下查询来识别每个 START - STOP 间隔的 start/end 次:

SELECT t1.`dateTime` AS start_time,  
      (SELECT t2.`dateTime`
       FROM mytable AS t2
       WHERE t2.ID = 'STOP' AND t1.CLI = t2.CLI AND 
             t1.`dateTime` < t2.`dateTime`
       ORDER BY t2.`dateTime` ASC LIMIT 1) AS end_time
FROM mytable AS t1
WHERE t1.ID = 'START'

使用上面的代码,你可以实现类似下面的东西来计算所有间隔中 ID 出现的次数:

SELECT ID, 
       SUM(CASE WHEN cnt >= 1 THEN 1 END) AS cnt,
       DATE(start_time)
FROM (       
  SELECT x1.ID, COUNT(*) AS cnt, x2.start_time
  FROM mytable AS x1
  INNER JOIN (
    SELECT t1.`dateTime` AS start_time,  
          (SELECT t2.`dateTime`
           FROM mytable AS t2
           WHERE t2.ID = 'STOP' AND
                 t1.CLI = t2.CLI AND 
                 t1.`dateTime` < t2.`dateTime`
           ORDER BY t2.`dateTime` ASC LIMIT 1) AS end_time
    FROM mytable AS t1
    WHERE t1.ID = 'START'
  ) AS x2 ON x1.`dateTime` BETWEEN x2.start_time AND x2.end_time
  WHERE x1.ID <> 'START' AND x1.ID <> 'STOP' AND x1.ID <> 'WELCOME'
  GROUP BY ID, x2.start_time, x2.end_time) AS t
GROUP BY ID, DATE(start_time)

Demo here

编辑:

如果您只想统计每条 STOP 记录之前出现的记录,则可以使用以下查询:

SELECT DATE(`dateTime`), ID, COUNT(*)
FROM (
  SELECT t1.`dateTime`, 
        (SELECT ID
         FROM mytable AS t2
         WHERE t1.CLI = t2.CLI AND 
               t2.`dateTime` < t1.`dateTime`
         ORDER BY t2.`dateTime` DESC LIMIT 1) AS ID      
  FROM mytable AS t1
  WHERE ID = 'STOP') AS t
  GROUP BY DATE(`dateTime`), ID

Demo here