gpt4 book ai didi

sql - 在列中查找序列中未缺失的前一个数字

转载 作者:行者123 更新时间:2023-12-04 09:04:46 28 4
gpt4 key购买 nike

我有一个表格,其中一列应该包含完整序列中的数字,为简单起见,我们将说 101 到 110。但是,该表格依赖于手动输入的不可靠信息,因此序列中的数字会被遗漏。同一个表中还有一个日期列我需要引用,稍后会详细介绍。我被要求找到所有丢失的序列号以及之前输入的序列号、输入日期以及下一个序列号及其输入日期。查找丢失的序列号很简单,它是获取我正在努力处理的相关上一个和下一个记录。所以如果我的数据看起来像这样;

table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
<html>

<body>
<table>
<tr>
<th>Seq No</th>
<th>Date Input</th>
</tr>
<tr>
<td>101</td>
<td>01-JAN-20</td>
</tr>
<tr>
<td>102</td>
<td>05-JAN-20</td>
</tr>
<tr>
<td>104</td>
<td>07-JAN-20</td>
</tr>
<tr>
<td>105</td>
<td>08-JAN-20</td>
</tr>
<tr>
<td>106</td>
<td>09-JAN-20</td>
</tr>
<tr>
<td>108</td>
<td>10-JAN-20</td>
</tr>
<tr>
<td>109</td>
<td>11-JAN-20</td>
</tr>
<tr>
<td>110</td>
<td>12-JAN-20</td>
</tr>
</table>
</body>

</html>

我的结果集看起来像;

table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
<html>
<body>
<table>
<tr>
<th>Missing Seq No</th>
<th>Previous Date</th>
<th>Next Date</th>
<th>Notes</th>
</tr>
<tr>
<td>103</td>
<td>05-JAN-20</td>
<td>07-JAN-20</td>
<td>Dates from found seq nos 102 and 104</td>
</tr>
<tr>
<td>107</td>
<td>09-JAN-20</td>
<td>10-JAN-20</td>
<td>Dates from found seq nos 106 and 108</td>
</tr>
</table>
</body>
</html>

但是没有注释栏,这只是为了清楚起见。
我可以得到一个答案,但是 sql 是如此庞大和笨拙,它与无用一样好。谢谢。

最佳答案

如果你想要每个间隙一行,那么你可以使用窗口函数:

select 
lag_seq_no last_sequence_number,
lag_date_input last_date_input,
seq_no next_sequence_number,
date_input next_date_input
from (
select
t.*,
lag(seq_no) over(order by date_input) lag_seq_no,
lag(date_input) over(order by date_input) lag_date_input
from mytable t
) t
where seq_no > lag_seq_no + 1
另一方面,如果您有连续的缺失数字并且每个数字都需要一行,那么您需要某种递归:
with 
data(seq_no, date_input, lag_seq_no, lag_date_input) as (
select
t.*,
lag(seq_no) over(order by date_input) lag_seq_no,
lag(date_input) over(order by date_input) lag_date_input
from mytable t
),
cte (seq_no, date_input, lag_seq_no, lag_date_input) as (
select seq_no, date_input, lag_seq_no + 1, lag_date_input
from data
where seq_no > lag_seq_no + 1
union all
select seq_no, date_input, lag_seq_no + 1, lag_date_input
from cte
where seq_no > lag_seq_no + 1
)
select
lag_seq_no missing_seq_no,
lag_date_input last_date_input,
date_input next_date_input
from cte

关于sql - 在列中查找序列中未缺失的前一个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63470179/

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