Сравните две строки, имеющие одинаковый ключ, и определите, является ли значение другим - PullRequest
0 голосов
/ 24 августа 2018

У меня есть таблица, которая выглядит так:

+ -------------+------------+------+-----------+-----------+
| M_PACK_INTID | M_PACK_REF | M_NB | M_XPFWSPT | M_BPFOLIO |
+ -------------+------------+------+-----------+-----------+
| 1.781        | 100        | 101  | 12        | PFOLIO    |
| 1.781        | 100        | 102  | 12        | PFOLIO    |
| 1.781        | 100        | 103  | 12        | PFOLIO    |
| 1.781        | 100        | 104  | 12.3      | PFOLIO    |
| 1.781        | 200        | 201  | 15        | PFOLIO    |
| 1.781        | 200        | 202  | 15        | PFOLIO    |
| 1.781        | 200        | 203  | 15        | PFOLIO    |
| 1.781        | 200        | 204  | 15        | PFOLIO    |
+ -------------+------------+------+-----------+-----------+

Обычно для каждого M_PACK_REF имеется 4 разных M_NB, которым назначается потенциально различный M_XPFWSPT.

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ: Я хотел бы извлечь все M_PACK_REF, для которых первый и четвертый M_NB имеют различное значение M_XPFWSPT. В приведенном выше примере это будет иметь место для M_PACK_REF = 100 (поскольку его M_NB = 101 имеет M_XPFWSPT = 12, а M_NB = 104 имеет M_XPFWSPT = 12.3).

Вот SQL скрипка , где вы можете поиграть.

Согласно данным этой скрипки, ожидаемый результат будет примерно таким:

M_PACK_REF
100
400

Я пытался извлечь из этой таблицы первую и последнюю строку для каждого M_PACK_REF и посчитать число встречающихся M_XPFWSPT, которые отличаются:

select M_PACK_REF
 from 
 (
    select M_PACK_REF, M_NB, M_XPFWSPT
    from GATHER
    where M_NB = (select min(M_NB) from GATHER G where G.M_PACK_REF = GATHER.M_PACK_REF)
    or M_NB = (select max(M_NB) from GATHER G where G.M_PACK_REF = GATHER.M_PACK_REF)
 )
 group by M_PACK_REF, M_NB, M_XPFWSPT
 having count (distinct M_XPFWSPT) > 1;

... но это показывает мне пустую таблицу. Может ли кто-нибудь помочь, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Если я правильно понимаю, вы можете просто использовать exists и having, чтобы сделать это.

select M_PACK_REF, M_NB, M_XPFWSPT
from GATHER g1
WHERE exists (
  SELECT 1 
  FROM GATHER g2
  HAVING
      min(g2.M_NB) = g1.M_NB OR MAX(g2.M_NB) = g1.M_NB 
  and 
      COUNT(distinct M_XPFWSPT) > 1
)
0 голосов
/ 24 августа 2018

не могли бы вы попробовать это?

WITH filtered as 
(
SELECT 
    M_PACK_REF,
    M_XPFWSPT,
    COUNT(*) as Cnt
FROM GATHER
    WHERE M_NB like '%01' or M_NB like '%04'
GROUP BY M_PACK_REF, M_XPFWSPT
HAVING COUNT(*) = 1
)

SELECT DISTINCT M_PACK_REF FROM filtered

Идея, что если значения для M_XPFWSPT различны, мы будем иметь по одной строке для каждой пары M_PACK_REF, M_XPFWSPT. Если M_XPFWSPT то же самое - count (*) вернет 2

0 голосов
/ 24 августа 2018

Прежде всего, пронумеруйте свои ряды, поэтому получите первый и четвертый за M_PACK_REF.Тогда сравните.

with numbered as
(
  select
    m_pack_ref,
    m_nb,
    m_xpfwspt,
    row_number() over (partition by m_pack_ref order by m_nb) as rn
  from gather
)
select *
from (select * from numbered where rn = 1) first
join (select * from numbered where rn = 4) fourth
  on  fourth.m_pack_ref = first.m_pack_ref
  and fourth.m_xpfwspt <> first.m_xpfwspt;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...