数据由ID名在指定日期服用补充剂(AABBC)的人组成,具体如下:

ID A AB B C
1 2021-01-01 2021-02-01 2021-03-01 2021-04-01
2 null 2021-06-01 null 2021-08-01
3 2021-09-01 null 2021-08-01 null
4 null null 2021-11-01 null
5 2021-09-01 2021-06-01 null null
6 2021-09-01 null 2021-11-01 2021-11-02
7 2021-09-01 2021-09-01 2021-11-01 2021-11-02
8 2021-09-01 null 2021-09-01 2021-11-02
9 2021-09-01 null 2021-09-01 2021-08-02
10 2021-09-01 null 2021-09-01 2021-07-02
11 2021-09-01 2021-09-01 null null
12 2021-08-01 2021-09-01 null null
13 2021-08-01 2021-09-01 null 2021-10-01
14 2021-08-01 null null 2021-09-01
15 2021-09-01 2021-12-01 null 2021-09-01
16 2021-10-01 null null 2021-09-01

Supplement 100 consists of supplements 101 and 102.

如果符合以下条件,我需要对每个ID个进行分类,并获得取BAB或两者的ID的日期:

  1. 必须在C(或C IS NULL)之前 Select BAB.
  2. 如果取B,则需要在B之前或同时取AAB.如果AB是在B之前取的,则AB是接收日期.如果A是在B之前获取的,则B是接收日期.

此外,有时一个ID可以一起接受补充剂,这也是可以的.例如,带有AABID 11.

当我看一看表时,它很容易应用,但将其放入逻辑中并不像我预期的那样起作用.

这是我的try ,不幸的是得出了错误的结果: 也许有一种完全不同的方法来做这样的事情?

SELECT *,
    CASE
        WHEN (AB IS NOT NULL AND (AB <= B OR B IS NULL)) THEN AB
        WHEN (A IS NOT NULL AND (A <= B OR B IS NULL)) THEN B
        ELSE NULL
    END AS SupplementDate
FROM Table1
WHERE (B IS NOT NULL OR AB IS NOT NULL) 
AND (C IS NULL OR (B IS NOT NULL AND (A IS NOT NULL OR AB IS NOT NULL)))
ORDER BY ID;

数据和方法:db<>fiddle

预期结果:

ID A AB B C SupplementDate
1 2021-01-01 2021-02-01 2021-03-01 2021-04-01 2021-02-01
2 null 2021-06-01 null 2021-08-01 2021-06-01
3 2021-09-01 null 2021-08-01 null null
4 null null 2021-11-01 null null
5 2021-09-01 2021-06-01 null null 2021-06-01
6 2021-09-01 null 2021-11-01 2021-11-02 2021-11-01
7 2021-09-01 2021-09-01 2021-11-01 2021-11-02 2021-09-01
8 2021-09-01 null 2021-09-01 2021-11-02 2021-09-01
9 2021-09-01 null 2021-09-01 2021-08-02 null
10 2021-09-01 null 2021-09-01 2021-07-02 null
11 2021-09-01 2021-09-01 null null 2021-09-01
12 2021-08-01 2021-09-01 null null 2021-09-01
13 2021-08-01 2021-09-01 null 2021-10-01 2021-09-01
14 2021-08-01 null null 2021-09-01 null
15 2021-09-01 2021-12-01 null 2021-09-01 null
16 2021-10-01 null null 2021-09-01 null

推荐答案

你的情况不是100%清楚,但看起来你可以这样做

SELECT *,
    CASE
      WHEN (LEAST(AB, B) <= C OR C IS NULL)
       AND (LEAST(AB, A) <= B OR B IS NULL)
      THEN LEAST(AB, B)
    END AS SupplementDate
FROM table1
ORDER BY ID;

在旧版本的SQL Server中,您不能使用LEAST.所以你需要做一堆CASEIIF

SELECT *,
    CASE
      WHEN (IIF(AB IS NOT NULL, IIF(B IS NOT NULL AND B < AB, B, AB), B) <= C OR C IS NULL)
       AND (IIF(AB IS NOT NULL, IIF(A IS NOT NULL AND A < AB, A, AB), A) <= B OR B IS NULL)
      THEN IIF(AB IS NOT NULL, IIF(B IS NOT NULL AND B < AB, B, AB), B)
    END AS SupplementDate
FROM table1
ORDER BY ID;

db<>fiddle

Sql相关问答推荐

如何重用表值用户定义函数调用的结果?

SQL查询:合并2个表

为什么在postgres中,横向连接比相关子查询快?

使用列表作为参数进行 Select ,如果为空,则在PostgreSQL中不使用参数进行 Select

如何将`now()`作为SQL插入语句的一部分?

将所有XML文件导入到SQL Server中

在Postgres中合并相似的表

我需要一个regexp_like来只验证字母D或T、数字和管道

PostgreSQL中递归CTE查询的故障过滤

使用CTE在SNOWFLAKE中创建临时表

在 PostgreSQL 中生成时间序列查询

计算不同模式的时间跨度

如何为给定的股票数据集计算利润/亏损,确保先卖出先买入的股票

从 varchar 列中删除特殊字符后的前面的零和字符时遇到问题

将 MERGE 语句与 Oracle PL/SQL 表类型一起使用时,导致无效数据类型错误的原因是什么?

MIN MAX 值与条件绑定

SQL查询以获取从特定可变日期看到的用户

Postgres 条件求和函数

在 Athena / Presto 中提取 JSON 对象以获取动态密钥

如何在 Oracle 中获取此变量的值?