如何编写SQL查询语句显示预约请求最少的星期几?
统计一周中预约请求最少的星期几的查询语句
核心思路
先按星期几分组统计预约数量,再筛选出数量最少的星期几(支持并列情况)。以下是基于Oracle数据库的实现方案(从你的表结构和日期格式判断为Oracle):
基础统计查询(查看各星期几的预约数)
SELECT TRIM(TO_CHAR(A_DATE_TI, 'DAY')) AS 星期几, COUNT(APP_ID) AS 预约数量 FROM APPOINTMENT GROUP BY TRIM(TO_CHAR(A_DATE_TI, 'DAY')) ORDER BY 预约数量 ASC;
- 使用
TRIM是因为TO_CHAR(A_DATE_TI, 'DAY')返回的星期名称默认带尾部空格,需要去除。 - 这条语句会按预约数量升序展示所有星期几的预约统计结果。
获取预约最少的星期几(支持并列)
如果存在多个星期几预约数相同且均为最少,用窗口函数RANK()可以一次性返回所有符合条件的记录:
SELECT 星期几, 预约数量 FROM ( SELECT TRIM(TO_CHAR(A_DATE_TI, 'DAY')) AS 星期几, COUNT(APP_ID) AS 预约数量, RANK() OVER (ORDER BY COUNT(APP_ID) ASC) AS 排名 FROM APPOINTMENT GROUP BY TRIM(TO_CHAR(A_DATE_TI, 'DAY')) ) WHERE 排名 = 1;
- 内层查询:分组统计每个星期几的预约数,同时按预约数升序排名,数量最少的记录排名为1。
- 外层查询:筛选出排名为1的记录,确保所有并列最少的星期几都能被返回。
显示中文星期名称(可选)
如果需要显示中文的星期名称(如「星期一」),可以指定日期语言参数:
SELECT 星期几, 预约数量 FROM ( SELECT TRIM(TO_CHAR(A_DATE_TI, 'DAY', 'NLS_DATE_LANGUAGE = SIMPLIFIED CHINESE')) AS 星期几, COUNT(APP_ID) AS 预约数量, RANK() OVER (ORDER BY COUNT(APP_ID) ASC) AS 排名 FROM APPOINTMENT GROUP BY TRIM(TO_CHAR(A_DATE_TI, 'DAY', 'NLS_DATE_LANGUAGE = SIMPLIFIED CHINESE')) ) WHERE 排名 = 1;
针对样本数据的返回结果
根据你提供的样本数据,统计后预约最少的是周日、周六、周三,各1条预约,上述查询会返回这三条记录。
内容的提问来源于stack exchange,提问作者user20834985
相关产品推荐
相关产品推荐

