- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个设施/节点表,以及一个带有简单查询/连接的 list 表,以显示当前打开的 list (具有空的 CLOSE_DATE 字段)。
节点可能有也可能没有检查表,只有一个打开的检查表,多个关闭的检查表。相当标准的东西。
但现在我还需要显示最近创建但已关闭的 list ,并且希望在开始将其集成到实际代码库之前检查我的解决方案的健全性。
注意:Oracle SQL
CREATE TABLE test_user (user_id number, user_name varchar2(16));
CREATE TABLE test_node (node_id number, node_name varchar2(16));
CREATE TABLE test_list (list_id number, node_id number, user_id number, create_date date, close_date date);
INSERT INTO test_user VALUES (1, 'apple');
INSERT INTO test_user VALUES (2, 'pear');
INSERT INTO test_node VALUES (1, 'facility 1');
INSERT INTO test_node VALUES (2, 'facility 2');
INSERT INTO test_node VALUES (3, 'facility 3');
INSERT INTO test_node VALUES (4, 'facility 4');
INSERT INTO test_list VALUES (1, 1, 1, '1-jan-2015', NULL);
INSERT INTO test_list VALUES (2, 2, 1, '1-jan-2015', '1-feb-2015');
INSERT INTO test_list VALUES (3, 2, 1, '1-apr-2015', '1-jun-2015');
INSERT INTO test_list VALUES (4, 2, 2, '1-mar-2015', '2-mar-2015');
INSERT INTO test_list VALUES (5, 2, 1, '1-nov-2015', NULL);
INSERT INTO test_list VALUES (6, 4, 2, '1-nov-2015', '15-nov-2015');
用户表主要是其中的一部分,以使左连接更复杂一些以模拟实际数据库。
我正在尝试创建一个 SQL,它将返回每个节点/设施、关于其当前打开的 list 的信息(如果有的话)以及关于最近关闭的 list 的信息(如果有的话)。
我最初尝试解决我的问题:
WITH list_breakout_open AS (
SELECT ll.list_id, ll.node_id, ll.create_date,
ll.user_id, uu.user_name
FROM test_list ll
JOIN test_user uu ON ll.user_id = uu.user_id
WHERE ll.close_date IS NULL
), list_breakout_close AS (
SELECT ll.list_id, ll.node_id, ll.create_date, ll.close_date,
ll.user_id, uu.user_name,
RANK() OVER (PARTITION BY ll.node_id ORDER BY ll.create_date DESC) AS close_rank
FROM test_list ll
JOIN test_user uu ON ll.user_id = uu.user_id
WHERE ll.close_date IS NOT NULL
)
SELECT nn.node_id, nn.node_name,
lbo.list_id AS open_list_id, lbo.user_name AS open_user_name, lbo.create_date AS open_create_date,
lbc.list_id AS close_list_id, lbc.user_name AS close_user_name, lbc.create_date AS close_create_date, lbc.close_date AS close_close_date
FROM test_node nn
LEFT JOIN list_breakout_open lbo ON nn.node_id = lbo.node_id
LEFT JOIN list_breakout_close lbc ON nn.node_id = lbc.node_id
AND close_rank = 1;
表格永远不会变得很大(几千行,而不是几百万),所以性能不是大问题。我最关心的是代码维护,想要一个干净的查询,当有人在 5 年后查看这个烂摊子时会有意义。
我的解决方案看起来合理吗?我是否遗漏了一些明显的东西,以后可能会误导我??
编辑:添加了关于我的最终查询应该做什么的注释。
最佳答案
您可以扫描每个表一次并使用分析函数进行聚合,如下所示:
SQL> SELECT n.node_id,
2 n.node_name,
3 min(case when l.close_date is null then l.list_id end) keep (dense_rank first order by nvl2(l.close_date, null, l.create_date) desc nulls last) open_list_id,
4 min(case when l.close_date is null then u.user_name end) keep (dense_rank first order by nvl2(l.close_date, null, l.create_date) desc nulls last) open_user_name,
5 min(case when l.close_date is null then l.create_date end) keep (dense_rank first order by nvl2(l.close_date, null, l.create_date) desc nulls last) open_create_date,
6 min(case when l.close_date is not null then l.list_id end) keep (dense_rank first order by nvl2(l.close_date, l.create_date, null) desc nulls last) close_list_id,
7 min(case when l.close_date is not null then u.user_name end) keep (dense_rank first order by nvl2(l.close_date, l.create_date, null) desc nulls last) close_user_name,
8 min(case when l.close_date is not null then l.create_date end) keep (dense_rank first order by nvl2(l.close_date, l.create_date, null) desc nulls last) close_create_date,
9 min(case when l.close_date is not null then l.close_date end) keep (dense_rank first order by nvl2(l.close_date, l.create_date, null) desc nulls last) close_close_date
10 FROM test_node n
11 LEFT JOIN test_list l ON l.node_id = n.node_id
12 LEFT JOIN test_user u ON u.user_id = l.user_id
13 GROUP BY n.node_id, n.node_name
14 ORDER BY node_id;
NODE_ID NODE_NAME OPEN_LIST_ID OPEN_USER_NAME OPEN_CREATE_DATE CLOSE_LIST_ID CLOSE_USER_NAME CLOSE_CREATE_DATE CLOSE_CLOSE_DATE
---------- ---------------- ------------ ---------------- ---------------- ------------- ---------------- ----------------- ----------------
1 facility 1 1 apple 01/01/2015
2 facility 2 5 apple 01/11/2015 3 apple 01/04/2015 01/06/2015
3 facility 3
4 facility 4 6 pear 01/11/2015 15/11/2015
不完全确定它是否像其他人提到的那样是正确的输出。我使用您发布的解决方案对其进行了验证。
关于sql - Oracle SQL 健全性检查 - 加入以获取最近创建的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34028387/
我在 Mac OsX 10.11 上使用 Xcode 7.0.1 (7A1001) 我使用 carthage 0.9.2 通过以下购物车文件下载reactivecocoa github“Reactiv
我正在将一个对象从属性“模型”(我从 Laravel 中的 Blade 属性模型中获得)分配给数据属性模型。后来数据属性模型发生变化,因为它绑定(bind)到表单输入字段。但 Prop “模型”也发生
当我更新数组内对象的属性然后作为组件的 Prop 传递时,在 svelte 中触发 react 性的正确方法是什么? let items = [{ id: 1, name: 'first'
我是 DRY principle 的坚定拥护者: Every piece of knowledge must have a single, unambiguous, authoritative rep
我正在实现一个需要以下功能的线程: 及时响应终止请求 推送消息 在等待消息时保持对 SendMessage 请求的响应 我对消息泵的初始实现使用了 GetMessage,如下所示: while not
在我的应用程序中,用户获得了一份已到达她的文档列表,并且可以对每个文档执行操作。 文件是分批提交的,当这种情况发生时,列表会增加。这一切都很好,这是预期的行为,但最好有一个按钮“暂停实时数据”,它会忽
我有一个属性为 的数据对象 displaySubtotal 我可以通过以下方式更新该属性的值: data.displaySubtotal = numPad.valueAsAString(); 我的方法
我需要一个垂直 slider 输入。由于内置的 sliderInput 函数无法做到这一点,因此我选择自己实现。根据this thread可以 (I) 使用 CSS 旋转 sliderInput
我正在从自定义用户权限管理系统迁移到 Alanning:roles v2.0 .我有一个非常基本的结构: 基本用户 用户组,每个用户组都有特定的设置。我将它们存储在一个“组”集合中。 管理群组的用户的
Shiny 中的响应式(Reactive)表达式将更改传播到需要去的地方。我们可以使用 isolate 来抑制一些这种行为。 ,但是我们可以抑制基于我们自己的逻辑表达式传播的更改吗? 我给出的例子是一
是否有(或可能有) react 性 Parsec (或任何其他纯函数式解析器)在 Haskell 中? 简而言之,我想逐个字符地为解析器提供数据,并获得与我提供的足够多的结果一样多的结果。 或者更简单
HTML(JADE) p#result Lorem ipsum is javascript j s lo 1 2 4 this meteor thismeteor. meteor input.sear
我有一个被导入函数更改的对象。 https://svelte.dev/repl/e934087af1dc4a25a1ee52cf3fd3bbea?version=3.12.1 我想知道如何使我的更改反
我有一个YUV 420半平面格式的图像,其中字节以这种方式存储: [Y1 Y2 ... [U1 V1.... Yk Yk+1...] Uk' Uk'+1] 其中Y平面的大小是UV平面的两倍,并
如何使用 ReactiveCocoa 订阅从 NSMutableDictionary 添加和删除的对象?另外,我想在它发生变化时广播通知。我的猜测是可以使用 RACMulticastConnectio
我正在构建一个带有多个选项卡的应用程序,其中一些选项卡涉及过多的计算,而另一些选项卡的计算速度很快。一个允许用户在 react 性或手动更新之间进行选择的复选框,与“刷新”按钮结合使用,将是理想的选择
我知道您可以在获取集合时使用 reactive: false 关闭 react 性。如何在内容可编辑区域内的集合字段中实现相同的效果?示例: Template.documentPage.events(
我想在 z3 中表示一个哈希函数,比如 SHA(x)。在做了一些研究之后,似乎 z3 不能很好地支持注入(inject)性,所以我不能有像这样的约束(虽然我意识到这并不是严格意义上的碰撞,但作为一种启
我正在解决一个问题,我想在仪表板中将数据显示为图表(通过 perak:c3 )和表格(通过 aslagle:reactive-table )。我的问题是数据是从 MongoDB 中的集合中提取的,它的
我的 ViewModel 中有这个函数,它返回一个信号,但内部 block 不起作用,我尝试添加断点,但它没有中断。这是我的代码。 func executeLoginAPI() -> RACSigna
我是一名优秀的程序员,十分优秀!