Ближайшее значение в пределах допустимого диапазона для нескольких идентификаторов - PullRequest
0 голосов
/ 02 сентября 2018

Я ищу что-то, учитывая таблицу как:

| channelid  | curveid  | xvalue   |
| 1          | 21       | 179.9216 |
| 1          | 21       | 180.4314 |
| 1          | 21       | 180.6528 |
| 1          | 21       | 180.9251 |
| 1          | 21       | 181.1334 |
| 1          | 21       | 181.4417 |
| 2          | 21       | 179.9513 |
| 2          | 21       | 180.1612 |
| 2          | 21       | 180.2022 |
| 2          | 21       | 180.8762 |
| 2          | 21       | 181.1331 |
| 2          | 21       | 181.2842 |
| 1          | 22       | 179.9213 |
| 1          | 22       | 180.4415 |
| 1          | 22       | 180.6226 |
| 1          | 22       | 180.9758 |
| 1          | 22       | 181.1639 |
| 1          | 22       | 181.4212 |
| 2          | 22       | 179.9715 |
| 2          | 22       | 180.1513 |
| 2          | 22       | 180.2326 |
| 2          | 22       | 180.8265 |
| 2          | 22       | 181.1437 |
| 2          | 22       | 181.2442 |

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

Я нашел это и это . С этим я могу найти самое близкое значение в общей сложности. Однако мне нужна помощь, чтобы расширить его, чтобы он возвращал наиболее близкие к каждой уникальной комбинации.

SELECT * FROM table 
WHERE xvalue >= ($myvalue - .5) AND xvalue <= ($myvalue + .5) 
ORDER by abs(xvalue - $myvalue)

Спасибо!

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Мне нравится использовать with для предварительной подготовки моих данных.

with min as
   (
     select channelid, curveid, min(abs(xvalue-$myvalue)) mindifference 
     from table group by channelid, curveid
   )
select channelid, curveid, xvalue from min innner join table using (channelid, curveid) where abs(xvalue-$myvalue) = mindifference

Это дает преимущество при просмотре результатов ex-aequo, и вы можете легко получить доступ к минимальной разнице во внешнем запросе.

0 голосов
/ 02 сентября 2018

Лучший способ сделать это в Postgres использует distinct on:

SELECT DISTINCT ON (channelid, curveid) t.*
FROM table  
ORDER by channelid, curveid, abs(xvalue - $myvalue);

Если вы знаете, что ближайшее значение находится в пределах 0,5 от $myvalue для всех комбинаций, которые вы хотите, тогда вы можете добавить предложение where.

0 голосов
/ 02 сентября 2018

Вы можете использовать группу по

select channelid, curveid,min(abs(xvalue - $myvalue)) 
from table
WHERE xvalue >= ($myvalue + .5) AND xvalue <= ($myvalue - .5) 
group by channelid, curveid 
ORDER by   min(abs(xvalue - $myvalue)) asc 

и, если вам нужно, также xvalue

select table.*, t.min_diff  from table  
inner join  (

  select channelid, curveid,min(abs(xvalue - $myvalue))  min_diff
  from table  
  WHERE xvalue >= ($myvalue + .5) AND xvalue <= ($myvalue - .5) 
  group by channelid, curveid 
  ORDER by   min(abs(xvalue - $myvalue)) asc 

) t on t.channelid = table.channelid 
      and y.curveid = table.curveid 
        and abs(table.xvalue - $myvalue) = t.min_diff 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...