使用主查询的字段计算子查询中的字段
Posted
技术标签:
【中文标题】使用主查询的字段计算子查询中的字段【英文标题】:Calculate a field in Sub Query using fields of Main Query 【发布时间】:2019-09-04 19:20:31 【问题描述】:我正在尝试使用 SQL 计算产品的失效:
SELECT DISTINCT ID_NO, START_DT, END_DT, TERM_NO
FROM DB1.TABLE1
ORDER BY ID_NO, START_DT;
我想在 ID 有第二个任期时计算 LAPSE。这将是第 1 学期的 END_DT
和第 2 学期的 START_DT
之间的天数。
我可以在 Excel 中轻松做到这一点。但我是编写任何高级 SQL 的新手。我可以得到一些方向或任何样本来实现这一目标吗?我试图用谷歌搜索,但我很难找到正确的搜索词组。
【问题讨论】:
可以有任意多条ID_NO相同的记录? 【参考方案1】:你可以使用lag()
:
select t1.*,
nullif((start_dt - lag(end_dt) over (partition by id_no order by start_dt)), 0) as lapse
from table1 t1;
【讨论】:
简洁优雅..谢谢!!【参考方案2】:您可以通过简单的左自连接来做到这一点:
select
t.*, t.start_dt - tt.end_dt as lapse
from tablename t left join tablename tt
on tt.id_no = t.id_no and tt.term_no = 1 and t.term_no = 2
您可以将ON
子句更改为:
on tt.id_no = t.id_no and t.term_no - tt.term_no = 1
如果termo_no
列中还有其他值,例如1, 2, 3, 4....
请参阅demo。 结果:
ID_NO | START_DT | END_DT | TERM_NO | LAPSE
:------- | :-------- | :-------- | ------: | ----:
48965787 | 13-DEC-17 | 13-DEC-18 | 1 |
48965787 | 30-DEC-18 | 13-DEC-19 | 2 | 17
57896248 | 17-JAN-18 | 17-JAN-19 | 1 |
57896248 | 17-JAN-19 | 17-JAN-20 | 2 | 0
78515698 | 16-JUN-18 | 16-JUN-19 | 1 |
78515698 | 01-AUG-19 | 16-JUN-20 | 2 | 46
【讨论】:
感谢您的帮助。我尝试了您的解决方案,它给了我预期的结果。但是我的表太大了,加入需要很长时间才能获得更少的结果。我将在这个实例中使用 Gordon 的方法以上是关于使用主查询的字段计算子查询中的字段的主要内容,如果未能解决你的问题,请参考以下文章
基于查询的子表单中的字段的 Access 2007 验证帮助