如何最好地组合多个 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