使用主查询的字段计算子查询中的字段

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 的方法

以上是关于使用主查询的字段计算子查询中的字段的主要内容,如果未能解决你的问题,请参考以下文章

Postgres:计算子查询中的唯一数组条目

mysql索引

基于查询的子表单中的字段的 Access 2007 验证帮助

SQL连接表的最大数量限制是适用于整个查询,还是单独计算子查询?

无法深入访问字段多个子查询

mysql 根据子表数量查询主表