首页 > 解决方案 > 在 SQL 中添加列,其中每行取决于其他行中的值

问题描述

我正在使用 SQL Server 2016。我正在尝试在 SQL 中完成一些我什至不确定是否可行的事情,如果是,我什至不知道从哪里开始如何实现它。

我有一个包含以下列的表格:

case_num:身份证号

年龄组:18-64、65+

BMI:包含一个数字或没有 BMI

BMI_flag:基于 BMI 和年龄的正常或异常

Follow_up:说明一个人是否有跟进。

ServiceDate:访问日期。每个 ID 有多个访问日期/行,但每个 ID 的访问量不同。

我需要创建一个新表并添加一个名为 Meets_Criteria 的列,用于确定一个人是否符合条件。我只关心这个人是否符合他们最近的访问,所以我知道我可能需要使用 rank_over_partition()。困难在于有一个六个月的回顾窗口。我不知道如何让一行依赖于其他行中的信息。

一个人符合以下标准:

测量BMI,这是正常的。或者在过去六个月内进行了正常的 BMI 测量。

进行 BMI 测量,这是异常的,并且他们进行了跟进。如果这发生在过去六个月内,他们也符合标准。随访不必与异常 BMI 测量在同一日期进行。

如果一个人在六个月内的测量结果正常,但最近的测量结果被标记为异常,他们必须进行跟进才能符合标准。

在 SQL 中这样的事情是可能的吗?我应该查看除 rank_over_partition 之外的哪些函数?

这最终将用于 PowerBI,因此我也对 DAX 解决方案持开放态度。

这是一个示例表

    CREATE TABLE mytable(
   case_num     INTEGER  NOT NULL PRIMARY KEY 
  ,age_group    VARCHAR(5) NOT NULL
  ,BMI          VARCHAR(6) NOT NULL
  ,BMI_flag     VARCHAR(8) NOT NULL
  ,Follow_Up    VARCHAR(3) NOT NULL
  ,Service_Date DATE  NOT NULL
);
INSERT INTO mytable(case_num,age_group,BMI,BMI_flag,Follow_Up,Service_Date) VALUES (1111,'18-64','22','Normal','No','6/21/2018');
INSERT INTO mytable(case_num,age_group,BMI,BMI_flag,Follow_Up,Service_Date) VALUES (1111,'18-64','No BMI','Abnormal','No','6/21/2018');
INSERT INTO mytable(case_num,age_group,BMI,BMI_flag,Follow_Up,Service_Date) VALUES (2222,'18-64','30','Abnormal','Yes','6/21/2018');
INSERT INTO mytable(case_num,age_group,BMI,BMI_flag,Follow_Up,Service_Date) VALUES (2222,'18-64','No BMI','Abnormal','No','3/30/2018');
INSERT INTO mytable(case_num,age_group,BMI,BMI_flag,Follow_Up,Service_Date) VALUES (3333,'18-64','No BMI','Abnormal','No','6/21/2018');
INSERT INTO mytable(case_num,age_group,BMI,BMI_flag,Follow_Up,Service_Date) VALUES (3333,'18-64','No BMI','Abnormal','Yes','3/30/2018');
INSERT INTO mytable(case_num,age_group,BMI,BMI_flag,Follow_Up,Service_Date) VALUES (3333,'18-64','30','Abnormal','No','2/14/2018');
INSERT INTO mytable(case_num,age_group,BMI,BMI_flag,Follow_Up,Service_Date) VALUES (4444,'18-64','30','Abnormal','No','6/21/2018');
INSERT INTO mytable(case_num,age_group,BMI,BMI_flag,Follow_Up,Service_Date) VALUES (4444,'18-64','24','Normal','No','1/22/2018');

以下是我希望看到的示例。我添加了一个原因列以进行澄清:示例集

标签: sqlsql-serverdax

解决方案


推荐阅读