SQL, чтобы найти максимум значений дельты из одного столбца - PullRequest
0 голосов
/ 17 декабря 2018

Найти: max (абс (c (a = 2) - c (a = 1))) упорядочить по b

С учетом таблицы T

a  b  c
-- -- --
1  1  2      
1  2  4
1  3  5
2  1  10
2  2  11
2  3  20
3  1  40
3  2  40
3  3  40

Пример математики:

c(@2) - c(@1) in order of b
10    - 2     = 8
11    - 4     = 7
20    - 5     = 15  <-- max found

Я могу получить ответ для разности b = 1, но я хочу упростить мой запрос без вырезания и вставки дополнительных значений, где b = 1, b = 2, b = 3 и т. Д. Не уверен, что cteприменяется здесь или a с рекурсивным запросом, который увеличивает b?

Окончательный рабочий запрос:

SELECT
    coalesce(max(abs(rn.c - r0.c)), -999) AS rd --> RETURN nulls = -999.
FROM
    (SELECT b, c FROM t WHERE a = 1) AS r0
JOIN
    (SELECT b, c FROM t WHERE a = 2) AS rn
ON r0.b = rn.b;

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Я пока не понимаю, что вы имеете в виду.Возможно, это может помочь.

DROP TABLE IF EXISTS t;
CREATE TABLE t( id integer,f integer, x integer);

INSERT INTO t VALUES (1,1,2), (1,2,4), (1,3,5);
INSERT INTO t VALUES (2,1,10), (2,2,11), (2,3,20);
INSERT INTO t VALUES (3,1,40), (3,2,40), (3,3,40);

SELECT * from t;

SELECT MAX(ABS(sup.x - inf.x))
FROM  (SELECT f, MAX(x) x from t WHERE id = 2 GROUP BY f) sup
      INNER JOIN (select f, MIN(x) x FROM t WHERE id = 1 GROUP BY f) inf ON sup.f = inf.f

Протестировано с https://kripken.github.io/sql.js/GUI/

0 голосов
/ 17 декабря 2018

Вот одна попытка использования функции отведения, которая ранжирует данные

create table t(a int, b int , c int)

insert into t values(1,1,2)      
insert into t values(1,2,4)
insert into t values(1,3,5)
insert into t values(2,1,10)
insert into t values(2,2,11)
insert into t values(2,3,20)
insert into t values(3,1,40)
insert into t values(3,2,40)
insert into t values(3,3,40)

with data
  as (select * /*First rank the results on the basis of columns a and b*/    
            ,row_number() over(order by a,b) as rnk
        from t
     )
,temp_data
  as (select a      
            ,b
            ,c
            ,rnk
            ,abs(c-lead(c,3) over(order by rnk)) as max_rnk
       from data
      )
select a,max(max_rnk) /*Gets the max value of rank grouped by each a*/      
  from temp_data
group by a

Демонстрация с использованием dbfiddle

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=b7db648a2512b623a7df4351326fa25d

0 голосов
/ 17 декабря 2018
create table stk_test(a int ,b int, c int)

insert into stk_test
select 1,1,2
union
select 1,2,4
union
select 1,3,5
union
select 2,1,10
union
select 2,2,11
union
select 2,3,20
union
select 3,1,40
union
select 3,2,40
union
select 3,3,40

select max(abs(a.a_c-b.b_c)) as Max_Diff_C from
(
    select c as a_c,b from stk_test ss
    where a=1
) a  join  
(
    select c  as b_c,b from stk_test ssr
    where a=2
)b on a.b=b.b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...