医院脚本开发:按周(含周数)展示数据的实现难题
解决医院排班数据按周分组展示的问题
我明白你遇到的困扰了——你尝试用GROUP BY Week(sdate)来按周分组展示排班数据,但没得到预期效果,这是因为GROUP BY是用来聚合统计数据的(比如计数、求和),而你需要的是按周分组保留原始记录并格式化展示,两者的用途完全不同。
问题分析
你的数据里已经自带了week字段,不需要再通过sdate计算周数。GROUP BY会把同一周的所有行合并成一行(配合聚合函数使用),这会丢失你需要保留的每条排班记录,自然达不到你要的展示格式。
解决方案:按周逻辑分组并展示
你需要先将数据按week排序,然后按周进行逻辑分组(不是聚合),再逐组输出标题、表头和记录。下面用Python代码举个实际例子,其他编程语言(比如JavaScript、Java)的思路是一致的:
from itertools import groupby # 模拟你的原始数据(可以替换成从数据库查询到的数据集) shift_data = [ {"nurse": 1, "ward": 2, "shift": "1st", "sdate": "2019-08-08", "week": 32}, {"nurse": 1, "ward": 3, "shift": "2nd", "sdate": "2019-08-09", "week": 32}, {"nurse": 1, "ward": 3, "shift": "1st", "sdate": "2019-08-10", "week": 32}, {"nurse": 1, "ward": 1, "shift": "2nd", "sdate": "2019-08-12", "week": 33}, {"nurse": 1, "ward": 2, "shift": "3rd", "sdate": "2019-08-13", "week": 33}, {"nurse": 1, "ward": 4, "shift": "2nd", "sdate": "2019-08-15", "week": 33}, {"nurse": 1, "ward": 2, "shift": "1st", "sdate": "2019-08-19", "week": 34}, ] # 第一步:按week字段排序(groupby要求数据先按分组键排序) sorted_shifts = sorted(shift_data, key=lambda item: item["week"]) # 第二步:按week分组并格式化输出 for week_number, group in groupby(sorted_shifts, key=lambda item: item["week"]): # 输出周标题 print(f"Week {week_number}") # 输出表头 print("Ward Shift Date") # 输出当前周的每条排班记录 for shift in group: print(f"{shift['ward']} {shift['shift']} {shift['sdate']}") # 空行分隔不同周的数据 print()
如果用SQL查询数据
如果你是从数据库取数,不需要用GROUP BY,只需要按week和sdate排序即可,把分组展示的逻辑交给应用层处理:
SELECT nurse, ward, shift, sdate, week FROM your_table_name ORDER BY week ASC, sdate ASC;
这样查询出来的数据已经按周和日期排好序,之后用上面的分组逻辑处理就能得到你想要的展示格式。
内容的提问来源于stack exchange,提问作者user2178637
相关产品推荐
相关产品推荐

