MySQL 条件日期查询

MySQL conditional date query

CREATE TABLE test (
revisionId char primary key,
claimId char,
revisionDate datetime,
lossDate datetime
);

INSERT INTO test (id, claimId, revisionDate, lossDate)
VALUES
('asdjb990n','oo223',2020-01-01 10:30:00,2020-01-30 12:30:00)
('asdjb990n2','oo223',2020-01-02 10:30:00,2020-01-30 12:30:00)

('asdjkn897','ioas992', 2020-04-02 11:30:00,2020-04-01 10:30:00)
('asdjkn123','ioas992', 2020-04-03 11:30:00,2020-04-01 10:30:00)

('sdnjkn998','oo2231', 2020-02-02 12:31:00,2020-02-15 11:00:00)

这是一个保险问题。我有索赔损失日期和保单修订日期。大多数情况下,在丢失日期之前会有修改。 99% 的情况下,我们希望包含修订日期最接近损失日期之前的修订 ID。在 claimId 'oo223' 的情况下,在 lossDate 之前最接近的 revisionDate 是 revisionId 'asdjb990n2'

这个不行的情况如下:

假设我们购买了另一家保险公司。当我们购买他们的公司时,我们也承担了他们的索赔。在那种情况下,我们可能在任何 revisionId 存在之前有一个 lossDate(如 revision id = 'asdjkn897')。

我需要一些表达方式 :

For every claimId if there is a revisionDate before the lossDate include the revisionId that comes closest to before the lossDate or else include the earliest revisionId after the lossDate if there are none before.

所以在 claimId = 'ioas992' 的情况下,因为 revisionid = 'asdjkn897' 的 revisionDate 是 2020-04-02 我想要那个 revisionId,因为它是丢失日期之后的最早修订(因为在 lossDate 之前没有修改)。

编辑:对不起,我最后一行的丢失日期有误

我只想 return 与每个声明 ID 的正确 revisionDate 关联的 revisionId。所以

claimID __revisionId

'oo223' - 'asdjb990n2'

'ioas992' - 'asdjkn897'

'oo2231' - 'sdjkn998'

假设索赔的所有行的损失日期都一致,那么您可以使用聚合:

select t.claimid,
       coalesce(max(case when revisionDate < lossdate then revisionDate end),
                min(case when revisionDate > lossdate then revisionDate end)
                )
from test t
group by claimid;

基本上,这会查找丢失前的最大修订日期。如果有 none,则为该日期之后的第一个。

然后您可以重新加入 table 以获取有关修订的更多信息。

Here 是一个 db<>fiddle.