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.
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.