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)
编辑:
如果您只想统计每条 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
请帮我解决这个问题:
我在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)
编辑:
如果您只想统计每条 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