我为这个模糊的问题表示歉意。我一直在尝试围绕这个查询工作一段时间。我在公司中必须使用的表格显示了货件编号(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