求助:REDCap生成筛选日期不匹配参与者报告的方法
REDCap筛选同一事件下日期不匹配参与者的解决方案
原代码问题分析
你之前写的day([date1]) <> day([date2]) <> day([date3]) <> day([date4])逻辑错误,REDCap的表达式会按顺序计算:先判断day([date1]) <> day([date2])得到布尔值(1或0),再用这个值和day([date3])比较,完全不是“所有日期天数值不全一致”的判断逻辑,所以得不到预期结果。
高效解决方案(适用于10个变量)
不用写所有两两组合的判断,直接利用最小值与最大值比较的思路:如果所有日期的最小值等于最大值,说明全一致;反之则存在不匹配。
1. 精确到完整日期(年/月/日)判断
如果需要判断**整个日期(含年月)**是否不一致(比如08-23和08-25属于不匹配,08-23和09-23也属于不匹配),用date()函数提取纯日期部分(自动忽略时间),再取min和max比较:
min(date([date1]), date([date2]), date([date3]), date([date4]), date([date5]), date([date6]), date([date7]), date([date8]), date([date9]), date([date10])) <> max(date([date1]), date([date2]), date([date3]), date([date4]), date([date5]), date([date6]), date([date7]), date([date8]), date([date9]), date([date10]))
2. 仅判断日期的“天”数值
如果只需要判断天的数字是否不一致(比如08-23和09-23视为天数值一致,不会被筛选),把date()换成day()即可:
min(day([date1]), day([date2]), day([date3]), day([date4]), day([date5]), day([date6]), day([date7]), day([date8]), day([date9]), day([date10])) <> max(day([date1]), day([date2]), day([date3]), day([date4]), day([date5]), day([date6]), day([date7]), day([date8]), day([date9]), day([date10]))
针对你的示例验证
- 参与者1的日期转成
date()后为:2024-08-23、2024-08-23、2024-08-23、2024-08-25,min=2024-08-23,max=2024-08-25,两者不等,会被筛选出来。 - 参与者2的所有
date()结果都是2024-09-02,min=max,不会被筛选。
空值处理(可选)
如果部分日期变量可能为空,且你希望仅当所有日期都填写且存在不匹配时才筛选,可以在前面加非空判断:
not(isempty([date1])) and not(isempty([date2])) and ... and not(isempty([date10])) and min(date([date1]), ...) <> max(date([date1]), ...)
如果允许部分空值,只要已填写的日期存在不匹配就筛选,直接用min/max的表达式即可,REDCap的聚合函数会自动忽略空值。
内容的提问来源于stack exchange,提问作者Jacob Leighty
相关产品推荐
相关产品推荐

