Я пытаюсь найти строку, у которой есть сумма разницы по порогу между другой строкой с postgresql.

Например, с помощью скрипта ниже, я могу создать тестовую таблицу.

/*prepare for test table*/
with recursive target_table(time,target,value,flg) as(
    select
        1
        , random()
        , random()
        , false
    union all
    select
        time+1
        , random()
        , random()
        , case when time=9 then true else false end
    from target_table
    where time < 20
)
select *,sum(value) over (order by time) as sum_of_value from target_table;

А таблица ниже - это пример таблицы.

1   0.5955741602068017  0.062468466592012106    false   0.062468466592012106
2   0.9599096994358831  0.2721417844426348  false   0.3346102510346469
3   0.5219622680617206  0.47568365271884616 false   0.8102939037534931
4   0.19330178068888415 0.055219926055169566    false   0.8655138298086626
5   0.7849454445680166  0.869388793530252   false   1.7349026233389147
6   0.3818554639492504  0.6618063662299782  false   2.396708989568893
7   0.14781479428049948 0.2939156384156725  false   2.6906246279845654
8   0.35489557675010985 0.3223190750002196  false   3.012943702984785
9   0.7468542842938106  0.4682370283799777  false   3.4811807313647627
10  0.9827402637131684  0.8947818572002681  false   4.375962588565031
11  0.9795760087001852  0.7735269168553209  false   5.149489505420352
12  0.7201651414850829  0.9190766910614023  false   6.068566196481754
13  0.4675524690241204  0.5993146022105726  false   6.667880798692327
14  0.7946650321278526  0.3035202408540094  false   6.971401039546336
15  0.9985454346140514  0.5523127942270101  true    7.523713833773346
16  0.5638512819364934  0.5059578895998662  false   8.029671723373212
17  0.3087199667465299  0.7731866673265166  false   8.802858390699729
18  0.5435603740732802  0.34633746722375847 false   9.149195857923488
19  0.9042064638800369  0.8654612596373745  false   10.014657117560862
20  0.6421889049801024  0.6367246358906549  false   10.651381753451517

Я хотел бы найти ближайшую строку, которая имеет сумму разницы по порогу между 15-й строкой, флаг которой равен true.

В это время, если порог равен 5, я хотел бы найти строку с суммой разности более 5 с 15-й строкой. И это 6-й ряд. Потому что 7,523713833773346-2.396708989568893 = 5.1270048442 больше 5 и это ближе всего к 15-му.

И, конечно, в таблице огромный объем данных. Как я могу найти каждый ряд, который подходит строке с флагом true?

0
kiitosu 21 Дек 2019 в 02:40

1 ответ

Это то, что вы ищите?

select max(t.id)
from mytable t
inner join mytable t15 
    on  t15.id = 15
    and t15.sum_of_value - t.sum_of_value > 5

Это дает вам наибольший идентификатор записей, значение которых отличается от 5 со значением записи с идентификатором 15.

Если вы хотите всю запись, то:

select t.*
from mytable t
inner join mytable t15 
    on  t15.id = 15
    and t15.sum_of_value - t.sum_of_value > 5
order by t1.id desc
limit 1
1
GMB 20 Дек 2019 в 23:49