- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想要做的就是总结 ID 在一组中的每个“情节”的时间,然后获得 NC 到 C 和 C 到 NC 的第一集时间以及最后一集时间NC 到 C 和 C 到 NC 在下表中,我手动添加了 GRP_Time 列。我还添加了最终结果表
这是我试图系统生成的指标。
ID ASSign_ID GRP Time GRP_Time
11 1788 NC 6
11 1802 NC 1 7
11 2995 C 7 7
11 5496 NC 11 11
11 6077 C 2
11 6216 C 2
11 6226 C 4 8
11 6790 NC 5 5
12 1234 C 6 6
12 2345 NC 1
12 3456 NC 8 9
12 4567 C 11 11
14 6789 C 2
14 7890 C 2
14 8900 C 4 8
14 8904 NC 5 5
结果表
ID First_ET_NC_C First_ET_C_NC LAST_ET_NC_C LAST_ET_C_NC
11 7 7 11 8
12 9 6 9 6
14 - 8 - 8
最佳答案
试试这个:
with seq as
(
select tbl.*,
row_number() over(order by assign_id) rn -- naturalized the order
from tbl
),
grp as
(
select cr.*,
sum(case when cr.grp = pr.grp or pr.grp is null then 0 else 1 end)
over(order by cr.rn) gn
from seq cr -- current row
left join seq pr -- previous row
on pr.rn = cr.rn - 1
)
,run as
(
select grp.*,
sum(time) over(partition by gn order by rn) as run_tot
from grp
)
select
id, assign_id, grp, time,
case when max(rn) over(partition by gn) <> rn then
null
else
run_tot
end as run_total
from run r;
输出:
ID ASSIGN_ID GRP TIME RUN_TOTAL
11 1788 NC 6 (null)
11 1802 NC 1 7
11 2995 C 7 7
11 5496 NC 11 11
11 6077 C 2 (null)
11 6216 C 2 (null)
11 6226 C 4 8
11 6790 NC 5 5
现场测试:http://www.sqlfiddle.com/#!4/faacc/1
<小时/>它是如何工作的:
ID ASSIGN_ID GRP TIME RN GN
11 1788 NC 6 1 0
11 1802 NC 1 2 0
11 2995 C 7 3 1
11 5496 NC 11 4 2
11 6077 C 2 5 3
11 6216 C 2 6 3
11 6226 C 4 7 3
11 6790 NC 5 8 4
我们基本上需要为连续的 grp 分配一个组号(GN
列)。然后我们可以根据 GN 进行分区的运行总计
您可以在此处查看查询的进度:http://www.sqlfiddle.com/#!4/faacc/1
每个步骤都建立在上一步的基础上。只需向下滚动即可查看解决方案的进展情况
<小时/>编辑
查询可以缩短,因为您的报告不显示每行总计的运行情况,并且仅显示最后一行,而不是 sum(time) over(partition by gn order by rn)作为 run_tot
,我们可以做 sum(time) over(partition by gn) as run_tot
,即我们删除 order by rn
;然后检测该行是否是最后一行,如果是则进行求和
,否则显示 null。
最终查询:
with seq as
(
select
tbl.*,
row_number() over(order by assign_id) rn -- naturalized the order
from tbl
),
grp as
(
select
cr.*,
sum(case when cr.grp = pr.grp or pr.grp is null then 0 else 1 end)
over(order by cr.rn) gn
from seq cr -- current row
left join seq pr -- previous row
on pr.rn = cr.rn - 1
)
select
grp.*,
case when max(rn) over(partition by gn) <> rn then -- if not last row
null
else -- if last row
sum(time) over(partition by gn)
end as running_total
from grp;
现场测试:http://www.sqlfiddle.com/#!4/faacc/7
<小时/><小时/>编辑
关于多个ID,例如6790:
ID ASSIGN_ID GRP TIME
11 1788 NC 6
11 1802 NC 1
11 2995 C 7
11 5496 NC 11
11 6077 C 2
11 6216 C 2
11 6226 C 4
11 6790 NC 5
12 6790 NC 1
12 6791 NC 3
12 6792 NC 1
12 6793 NC 4
12 6794 C 1
12 6795 C 6
12 6797 C 8
13 6793 C 1
13 6794 C 4
13 6795 C 3
有两个相似的 ASSIGN_ID,例如6790,但它属于一个更大的组(在 ID 上,对于 11 和 12),因此为了隔离这两个组,我们必须按 ID 对其进行分区。
这是最终的查询,请注意评论中添加了此内容:http://www.sqlfiddle.com/#!4/83789/2
with seq as
(
select tbl.*,
-- added this: partition by id
-- naturalized the order: rn
row_number() over(partition by id order by assign_id) rn
from tbl
)
,grp as
(
select cr.*,
-- added this: partition by cr.id
sum(case when cr.grp = pr.grp then 0 else 1 end)
over(partition by cr.id order by cr.rn) gn
from seq cr -- current row
left join seq pr -- previous row
on
pr.id = cr.id -- added this
and pr.rn = cr.rn - 1
)
select id, assign_id, grp, time,
-- added this: partition by id
case when max(rn) over(partition by id,gn) <> rn then
null
else
-- added this: partition by id
sum(time) over(partition by id,gn)
end as running_total
from grp
order by id, rn;
输出:
ID ASSIGN_ID GRP TIME RUNNING_TOTAL
11 1788 NC 6 (null)
11 1802 NC 1 7
11 2995 C 7 7
11 5496 NC 11 11
11 6077 C 2 (null)
11 6216 C 2 (null)
11 6226 C 4 8
11 6790 NC 5 5
12 6790 NC 1 (null)
12 6791 NC 3 (null)
12 6792 NC 1 (null)
12 6793 NC 4 9
12 6794 C 1 (null)
12 6795 C 6 (null)
12 6797 C 8 15
13 6793 C 1 (null)
13 6794 C 4 (null)
13 6795 C 3 8
这是如何工作的,请记下ID 和 GN:
ID ASSIGN_ID GRP TIME RN GN RUNNING_TOTAL
11 1788 NC 6 1 1 (null)
11 1802 NC 1 2 1 7
11 2995 C 7 3 2 7
11 5496 NC 11 4 3 11
11 6077 C 2 5 4 (null)
11 6216 C 2 6 4 (null)
11 6226 C 4 7 4 8
11 6790 NC 5 8 5 5
12 6790 NC 1 1 1 (null)
12 6791 NC 3 2 1 (null)
12 6792 NC 1 3 1 (null)
12 6793 NC 4 4 1 9
12 6794 C 1 5 2 (null)
12 6795 C 6 6 2 (null)
12 6797 C 8 7 2 15
13 6793 C 1 1 1 (null)
13 6794 C 4 2 1 (null)
13 6795 C 3 3 1 8
在此处查看查询进度:http://www.sqlfiddle.com/#!4/83789/2
<小时/>更新尝试使用这个,它更简洁易读:https://stackoverflow.com/a/10629498
关于sql - 甲骨文分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10622856/
我正在尝试在 64 位 Windows 7 计算机上安装 Oracle Instant Client 和 ODBC 驱动程序。 我已经下载了两个 即时客户端包 - 基本 即时客户端包 - ODBC 我
每当我在 ORACLE 中授予用户“所有权限”(下面的示例)时,这实际上做了什么? 我的理解是,它赋予用户任何权限,例如在该架构中插入、删除等,但不数据库中的任何架构? grant all privi
我目前无法访问任何 Oracle 书籍,而且我的在线搜索几乎没有返回任何结果(Google 中的 (+) 什么也没有显示)。我正在查看现有代码以向查询添加一些字段并看到: AND lookup.Loo
我的访问表如下: insert into Visit values(12, to_date('19-JUN-13', 'dd-mon-yy'), to_date('19-JUN-13 12:00 A.
我的数据格式如下: cons_Type COLUMN_NAME P (COL1) R (COL6_REFERENCE) R (C
我希望我的表根据它的 TEMPLATE_ID 对其“排序依据”列进行排序。 我希望这发生在插入时(可能通过插入触发器)。 例如,如果我运行以下插入,我应该得到下表中的值。 INSERT INTO TE
我有一个场景,我必须为低于 SQL 阈值限制的值排名负数。任何人都可以帮助我吗? Name Target Rank John 2500 -2 Hopkins 4000 -1
我想用另一个表中的随机名称更新表中的名称。表 Users 中有真实的用户名。表 tmp_users 中有编造的名字。我想用 tmp_users 表中的随机名称更新用户表中的所有名称。这个想法是用假客户
如何从匹配删除表的表中删除记录?就像,我有一个记录键表,上面写着需要从我的主表中删除的内容。我将如何编写删除语句来表示“从我的主表中删除此字段与我的删除表中的字段匹配的任何内容?” 最佳答案 如果是小
我有一个关于表创建的问题。我想将“Ono”和“Pno”的属性组合成一个新表的主键。这些都是外键,每个都来自不同的表。我是否只使用 CONSTRAINT Ono_Pno_PK PRIMARY KEY (
我的情况(简化)如下所示: 表 UNITS 在 UNITS.NAME 上有一个 PK。 (单位名称, varchar(12)) 表 DEPTS 在 DEPTS.NAME 上有一个 PK。 (部门名称,
假设我有一个带有自动递增代理键的表。 这是使用反向索引的好例子吗? 我说的对吗: 插入(到索引中)会更快......因为新值会随机插入,而不是总是进入最右边的叶子(不断强制重新平衡)。 索引查找会稍微
我试图创建一个新表 (tableB),它带有到另一个表 (tableA) 的外键约束,只是想知道是否可以创建所有需要的约束和索引。我的目标是拥有一个 create table不需要 alter tab
唯一约束列中是否可以有2个或多个空值? 最佳答案 易于检查:(答案为是) create table t1 (col1 number unique); Table T1 created. insert
如何从delphi 7(ado组件)将blob数据插入oracle xe 最佳答案 使用TAdoQuery检查这些样本组件。 直接从文件加载数据 ADOQuery1.Parameters.AddPa
我试图在表 A 上创建一个约束,以检查表 B 中是否存在一组记录。我可以使用外键,但问题是表 B 中的数据不唯一。 有没有办法在不创建触发器的情况下创建这样的约束? 编辑:我无法更改表 B 结构。 最
我正在加载一个查找员工表的表。然而,有时源文件和 Employee 表中的名称不正确匹配。 **Employee table:** Employee Name Paul Jaymes **Source
我正在寻找在相对较大的表中进行相对复杂查询的最有效方法。 概念是: 我有一个表,其中包含可以相互并行运行的阶段的记录 记录量超过 500 万(并且还在增加) 时间段从大约 5 年前开始 由于性能原因,
我已经搜索了我的问题的解决方案,这个 question describes it perfectly . Let´s say I have one table called ProjectTimeSp
如何获取 varchar2 列中允许的最大和最小长度。我必须测试来自某个远程数据库的临时表的传入数据。并且要针对特定列测试每一行值是否具有可以设置到该列中的最大值或最小值。 所以我要使用其架构详细
我是一名优秀的程序员,十分优秀!