gpt4 book ai didi

sql - 如何在没有过程的情况下使用一系列日期连接表

转载 作者:搜寻专家 更新时间:2023-10-30 19:57:50 24 4
gpt4 key购买 nike

我有两个表,我们称它们为表 A 和 B:-

表 A 如下所示:

   A.Num1       |   A.Num2      |   A.Date      
12345 | 38170 | 28/05/2013
12345 | 38170 | 29/05/2013
12345 | 38170 | 31/05/2013
12345 | 38170 | 01/06/2013
12345 | 38170 | 03/06/2013
12345 | 38170 | 04/06/2013
12345 | 38170 | 04/06/2013
12345 | 38170 | 07/06/2013

表 2 (B) 如下所示:

    B.Num1      |   B.Num2      |   B.Status    |   B.Date
12345 | 38170 | New | 28/05/2013
12345 | 38170 | Closed | 31/05/2013
12345 | 38170 | Reopened | 04/06/2013

我需要一个这样的表作为输出——它应该基本上包含表 A 中的所有行 + 表 B 中的状态

    Num1        |   Num2        |   Status      |   Date
12345 | 38170 | New | 28/05/2013
12345 | 38170 | New | 29/05/2013
12345 | 38170 | Closed | 31/05/2013
12345 | 38170 | Closed | 01/06/2013
12345 | 38170 | Closed | 03/06/2013
12345 | 38170 | Reopened | 04/06/2013
12345 | 38170 | Reopened | 04/06/2013
12345 | 38170 | Reopened | 07/06/2013

此外,最好通过简单的 SQL 语句,而不是过程。

提前致谢。请评论任何澄清

工业

更新

当表 B 中的两行在同一日期发生状态更改时,我在连接中得到不一致的值。

举个例子:

我有两个表,比如 A 和 B。它们是非常大的表,它们记录了特定信息。每隔几天扫描一次数据的表 A 文件,但缺少状态栏如果有变化,那么表 B 会得到一个带有状态列的新条目。我需要匹配这两个并为表 A 中对应于 B 的每个条目导出一个状态。

表B

Id  | Num1  | Num2  | CreatedOn   | Status
100 | 12345 | 38170 | 28/05/2013 | New
150 | 12345 | 38170 | 28/05/2013 | Closed
200 | 12345 | 38170 | 31/05/2013 | Reopened
250 | 12345 | 38170 | 04/06/2013 | Closed

表A

Id  | Num1  | Num2  | CreatedOn
55 | 12345 | 38170 | 28/05/2013
99 | 12345 | 38170 | 30/05/2013
145 | 12345 | 38170 | 31/05/2013
192 | 12345 | 38170 | 31/05/2013
223 | 12345 | 38170 | 04/06/2013

期望的输出

Id  | Num1  | Num2  | CreatedOn   | Status
55 | 11552 | 38170 | 28/05/2013 | New
99 | 11552 | 38170 | 30/05/2013 | Closed
145 | 11552 | 38170 | 31/05/2013 | Reopened
192 | 11552 | 38170 | 31/05/2013 | Reopened
223 | 11552 | 38170 | 04/06/2013 | Closed

相反,我得到:(使用 Jeffrey Kamp 的回复)

Id  | Num1  | Num2  | CreatedOn   | Status
55 | 11552 | 38170 | 28/05/2013 | Closed
99 | 11552 | 38170 | 30/05/2013 | Closed
145 | 11552 | 38170 | 31/05/2013 | Reopened
192 | 11552 | 38170 | 31/05/2013 | Reopened
223 | 11552 | 38170 | 04/06/2013 | Closed

还有这个:(使用回复 2 - Mark Ba​​nnister)

Id  | Num1  | Num2  | CreatedOn   | Status
55 | 11552 | 38170 | 28/05/2013 | New
99 | 11552 | 38170 | 30/05/2013 | New
145 | 11552 | 38170 | 31/05/2013 | Reopened
192 | 11552 | 38170 | 31/05/2013 | Reopened
223 | 11552 | 38170 | 04/06/2013 | Closed

很明显,记录 Id-55 可以是 New 或 Closed,因为表 B 中同一天 (28/05/13) 有两个条目。但逻辑是它从 New -> Closed -> Reopened那么有什么办法可以做到这一点吗?

最佳答案

对于初学者来说很简单:

SELECT A.Num1
,A.Num2
,NVL(
(SELECT DISTINCT
FIRST_VALUE(B.Status)
OVER (ORDER BY B.Date DESC)
FROM B
WHERE B.Num1 = A.Num1
AND B.Num2 = A.Num2
AND B.Date <= A.Date
),'New') AS Status
,A.Date
FROM A;

虽然可能有更好的方法可以更快地工作。

关于sql - 如何在没有过程的情况下使用一系列日期连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17059188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com