如何最好地组合多个 select 语句来为报告创建单个数据集
how best to combine multiple select statements to create single dataset for report
我目前有 3 个 select 语句提取白班、夜班和周六的用户登录信息。我想将所有这些组合成单个 query/dataset 然后我可以在我们的 BI 工具中使用拉单个 report/chart。
运行 这些每个都单独给出了我正确的输出,但想结合起来然后可以生成 report/graph 每个覆盖。
感谢任何帮助。
SELECT
DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users DayShift`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '04:00:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '16:30:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) BETWEEN 0 AND 4
GROUP BY 1
ORDER BY Date DESC
SELECT
DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users NightShift`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '16:30:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '21:00:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) BETWEEN 0 AND 4
GROUP BY 1
ORDER BY Date DESC
SELECT
DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users Saturday`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '04:00:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '21:00:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) = 5
GROUP BY 1
ORDER BY Date DESC
您可以为此目的使用 UNION,我相信您需要将 ORDER BY 放在最后而不是每个 SELECT :
SELECT
DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users DayShift`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '04:00:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '16:30:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) BETWEEN 0 AND 4
GROUP BY 1
UNION
SELECT
DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users NightShift`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '16:30:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '21:00:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) BETWEEN 0 AND 4
GROUP BY 1
UNION
SELECT
DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users Saturday`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '04:00:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '21:00:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) = 5
GROUP BY 1
ORDER BY Date DESC
使用条件聚合。这个想法是将条件移动到聚合表达式中。我还建议在子查询中偏移日期,这样就不需要在查询中重复表达式。
所以:
SELECT
DATE(login_time) AS Date,
COUNT(DISTINCT
CASE WHEN TIME(login_time) >= '04:00:00'
AND TIME(login_time) < '16:30:00'
AND WEEKDAY(DATE(login_time)) BETWEEN 0 AND 4
THEN user_id
END
) AS `Number of Unique Users DayShift`,
COUNT(DISTINCT
CASE WHEN TIME(login_time) >= '16:30:00'
AND TIME(login_time) < '21:00:00'
AND WEEKDAY(DATE(login_time)) BETWEEN 0 AND 4
THEN user_id
END
) AS `Number of Unique Users NightShift`,
COUNT(DISTINCT
CASE WHEN TIME(login_time) >= '04:00:00'
AND TIME(login_time) < '21:00:00'
AND WEEKDAY(DATE(login_time)) = 5
THEN user_id
END
) AS `Number of Unique Users DayShift`
FROM (SELECT login_time - INTERVAL 7 HOUR login_time, user_id FROM users_logins) u
GROUP BY 1
ORDER BY Date DESC
我目前有 3 个 select 语句提取白班、夜班和周六的用户登录信息。我想将所有这些组合成单个 query/dataset 然后我可以在我们的 BI 工具中使用拉单个 report/chart。 运行 这些每个都单独给出了我正确的输出,但想结合起来然后可以生成 report/graph 每个覆盖。
感谢任何帮助。
SELECT
DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users DayShift`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '04:00:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '16:30:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) BETWEEN 0 AND 4
GROUP BY 1
ORDER BY Date DESC
SELECT
DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users NightShift`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '16:30:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '21:00:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) BETWEEN 0 AND 4
GROUP BY 1
ORDER BY Date DESC
SELECT
DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users Saturday`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '04:00:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '21:00:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) = 5
GROUP BY 1
ORDER BY Date DESC
您可以为此目的使用 UNION,我相信您需要将 ORDER BY 放在最后而不是每个 SELECT :
SELECT
DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users DayShift`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '04:00:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '16:30:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) BETWEEN 0 AND 4
GROUP BY 1
UNION
SELECT
DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users NightShift`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '16:30:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '21:00:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) BETWEEN 0 AND 4
GROUP BY 1
UNION
SELECT
DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users Saturday`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '04:00:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '21:00:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) = 5
GROUP BY 1
ORDER BY Date DESC
使用条件聚合。这个想法是将条件移动到聚合表达式中。我还建议在子查询中偏移日期,这样就不需要在查询中重复表达式。
所以:
SELECT
DATE(login_time) AS Date,
COUNT(DISTINCT
CASE WHEN TIME(login_time) >= '04:00:00'
AND TIME(login_time) < '16:30:00'
AND WEEKDAY(DATE(login_time)) BETWEEN 0 AND 4
THEN user_id
END
) AS `Number of Unique Users DayShift`,
COUNT(DISTINCT
CASE WHEN TIME(login_time) >= '16:30:00'
AND TIME(login_time) < '21:00:00'
AND WEEKDAY(DATE(login_time)) BETWEEN 0 AND 4
THEN user_id
END
) AS `Number of Unique Users NightShift`,
COUNT(DISTINCT
CASE WHEN TIME(login_time) >= '04:00:00'
AND TIME(login_time) < '21:00:00'
AND WEEKDAY(DATE(login_time)) = 5
THEN user_id
END
) AS `Number of Unique Users DayShift`
FROM (SELECT login_time - INTERVAL 7 HOUR login_time, user_id FROM users_logins) u
GROUP BY 1
ORDER BY Date DESC