有没有一种方法可以按顺序比较所有记录?

时间:2020-07-24 09:11:34

标签: database if-statement groovy

我有随机数量的端口,每个端口都可以重复随机数量的对(所有可能的对-A,B,C,D)。我的任务是从数据库中提取排序的记录,然后一个一个地比较所有记录。 当我取出排序的记录时,它看起来像这样:

record 1:

port_nbr | 1                          
pair     | pairA
length   | 30.00
add_date | 2020-06-16 00:01:13.237164
record 2:

port_nbr | 1                              
pair     | pairA
length   | 65.00
add_date | 2020-06-16 00:02:13.237164
record 3:

port_nbr | 2                              
pair     | pairc
length   | 65.00
add_date | 2020-06-16 00:02:13.237164

这只是示例。 Port_nbr可以使用不同的对(A-D)重复多次。我的任务是比较第一条记录是否与第二条记录具有相同的port_nbr。如果为真,则比较第一条记录对与第二条记录对是否相同。如果它也是正确的,它将计算这两个记录之间的长度变化。如果更改大于30,则将其打印出来;如果更改不大于30,则继续进行第二/第三条记录。它将继续进行直到没有更多的记录了。任务是在2条记录之间打印出长度变化大于30m的所有记录,但是它只能比较具有相同port_nbr和对的记录。如果不相同,它将比较其他记录。在这3个记录示例中,应该打印出1/2条记录,因为它们具有相同的port_nbr,对且长度变化大于30m。之后,它将记录2与记录3进行比较。由于它们具有不同的端口,因此它将记录3与记录4进行比较,依此类推。直到没有更多记录为止。

此刻我的代码:

import java.sql.*;
import groovy.sql.Sql

class Main{
static void main(String[] args) {

def dst_db1 = Sql.newInstance('connection.........')
dst_db1.getConnection().setAutoCommit(false)


def sql = (" select d.* from (select d.*, lead((case when length <> 'N/A' then length else length_to_fault end)::float) over (partition by port_nbr, pair order by port_nbr, pair, d.add_date) as lengthh from diags d)d limit 10")

def lastRow = [id:-1, port_nbr:-1, pair:'', lengthh:-1.0]
dst_db1.eachRow( sql ) {row ->

if( row.port_nbr == lastRow.port_nbr && row.pair == lastRow.pair){
BigDecimal lengthChange =
new BigDecimal(row.lengthh ? row.lengthh : 0 ) - new BigDecimal(lastRow.lengthh ? lastRow.lengthh :0 )

if( lengthChange > 30.0){
print "Port ${row.port_nbr}, ${row.pair} length change: $lengthChange"
println "/tbetween row ID ${lastRow.id} and ${row.id}"
}
lastRow = row
}else{
println "Key Changed"
lastRow = row
}
}
}
}

选择的部分是正确的,我对其进行了测试。我打印的所有内容都是一次-更改了密钥。它应该打印出许多记录,因为有许多记录的长度变化大于30 ...也许在if语句中有问题?

0 个答案:

没有答案