在SQL中添加列,其中每一行取决于其他行中的值

时间:2018-06-22 19:55:50

标签: sql sql-server dax

我正在使用SQL Server2016。我试图在SQL中完成一些我什至不确定是否可以实现的事情,如果可以,我什至不知道从何处开始如何实现它。

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

case_num:ID号

年龄段:18-64岁,65岁以上

BMI:包含数字或没有BMI

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

跟进:说明某人是否进行了跟进。

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');

下面是一个我期望看到的示例。我添加了一个原因列进行说明:Example set

0 个答案:

没有答案