如何从同一行中获取截止值之前的最长日期?

时间:2018-11-12 13:19:01

标签: sql oracle

我为这个模糊的问题表示歉意。我一直在尝试围绕这个查询工作一段时间。我在公司中必须使用的表格显示了货件编号(id),状态代码,为这些状态键入的手册值以及时间戳。事情有点混乱。该表包含许多不必要的列,但将在下面进行细分。

SELECT
   id,
   stat_code,
   event_date,
   insert_date
FROM
   table

上面的代码返回多个相同的stat_code,但是具有不同的insert_date。我被要求仅对每个ID的最后一次手动输入执行分析,因此我的下一张表如下所示:

WITH
last_status AS (SELECT
   id,
   stat_code,
   event_date,
   insert_date
   ROW_NUMBER() OVER (PARTITION BY id, stat_code ORDER BY insert_date DESC) RN
FROM
   table)

SELECT
    id,
    stat_1.event_date
FROM
    table2
    LEFT JOIN last_status stat_1 ON table2.id=stat_1.id AND stat_1.stat_code='stat 1' AND stat_1.RN=1

这使我可以通过回收last_status表(始终将RN选择为1)来向第二个SELECT语句添加所需的状态。 对于不同的项目,我需要在不同状态之前插入的最后一个状态(也可以多次插入。同意将其与第一个插入进行比较)。 假设stat_1的event_date是货物应到达目的地的估计日期,而stat_2的event_date是实际到达日期。我的公司想看看估计值相对于实际值有多准确。在某些情况下,stat_1在stat_2之后进行了更新,但是我们只想比较stat_1的event_date,对于它们,insert_date <= event_date是第一个插入的stat_2。这是我到目前为止所做的

WITH
first_status AS (SELECT
   id,
   stat_code,
   event_date,
   insert_date,
   ROW_NUMBER() OVER (PARTITION BY id, stat_code ORDER BY insert_date ASC) RN
FROM
   table),

last_stat_1 AS (SELECT * FROM (SELECT
   t.id,
   t.event_date,
   ROW_NUMBER() OVER (PARTITION BY t.id, t.stat_code ORDER BY t.insert_date DESC) RN
FROM
   table t
   LEFT JOIN first_status stat_2 ON t.id=stat_2.id and stat_2.stat_code='stat 2' AND RN=1
WHERE
   t.stat_code='stat 1' and (t.insert_date < stat_2.event_date OR stat_2.event_date IS NULL) WHERE RN=1)

SELECT
    id,
    stat_1.event_date
FROM
    table2
    LEFT JOIN last_stat_1 stat_1 ON table2.id=stat_1.id

这种方法不是很干净,也不是很好。如果我需要添加其他状态,则必须编写另一个表。我想以某种方式编写函数来执行以下计算,以便每当需要将新状态映射到我的报表中时,我都可以回收函数last_before()。如何创建这样的函数以获得以下结果?

SELECT
   id,
   last_before(stat_1,stat_2) last_stat_1
FROM

或者以某种方式获取第一个表并仅允许使用“状态1”(s)-所有这些都插入在第一个“状态2”之前(以及其他状态的规则)。 因此,在下面的示例中,我不想看到第3行和第4行,因为它们插入了15-aug,但是状态2的event_date是14-aug。

id  stat_code   event_date  insert_date
x   stat 8      12-AUG-16   16-SEP-16
x   stat 7      18-AUG-16   18-AUG-16
x   stat 1      14-AUG-16   15-AUG-16
x   stat 1      15-AUG-16   15-AUG-16
x   stat 2      14-AUG-16   15-AUG-16
x   stat 6      08-AUG-16   10-AUG-16
x   stat 5      09-AUG-16   10-AUG-16
x   stat 4      11-AUG-16   04-AUG-16
x   stat 3      23-AUG-16   04-AUG-16
x   stat 1      15-AUG-16   04-AUG-16
x   stat 1      13-AUG-16   02-AUG-16
x   stat 4      09-AUG-16   02-AUG-16
x   stat 3      21-AUG-16   02-AUG-16

0 个答案:

没有答案