我有表:
t_patients(id为auto_increment)
| 身份证|患者编号|创建时间|
| - ------|- ------|- ------|
| 1个|一百|2023年1月10日|
| 第二章|二百|2023年1月11日|
| 三个|一百|2023年1月15日|
结果需要这样:
| 患者编号|第一次来|第二次来|第三次来|
| - ------|- ------|- ------|- ------|
| 一百|2023年1月10日|2023年1月15日|x|
| 二百|2023年1月11日|x|x|
我已经在谷歌上搜索过了,但是仍然没有找到所需的确切输出。SQL应该是什么查询?
2条答案
按热度按时间uxhixvfz1#
你可以使用mysql中的COALESCE函数和条件聚合来实现这一点。
MySQL的COALESCE()函数用于返回表达式列表中的第一个非空值。如果列表中的所有值都为NULL,则COALESCE()函数返回NULL。
这里是a demo using DBFIDDLE。
以下查询将为您提供预期输出:
输出:
| 患者编号|第一次来|第二次来|第三次来|
| - ------|- ------|- ------|- ------|
| 一百|2023年1月10日|2023年1月15日|x|
| 二百|2023年1月11日|x|x|
yh2wf1be2#
我写了一个不使用窗口函数的查询(因为MySQL 5.7及以下版本不支持窗口函数)。为了让事情更有趣,让我们添加几行:
之后,让我们编写一个查询,根据每个患者的create_at值排列每个patient_id。为每个患者的create_at值指定一个row_id,从1开始。注意,每当patient_id更改时,row_id值应重置为1,因此每个patient_id都可以从1开始。
然后,上面的查询被用作我们的主查询的派生表(别名为
tb
),它执行表透视工作。这里我决定使用min()
函数,而不是使用coalesce
函数,因为在ascii中,数字作为字符串出现在字母之前,所以当create_at值存在时,min()
将选择create_at而不是字母x
。