Как найти похожие группы по разным идентификаторам - PullRequest
0 голосов
/ 28 февраля 2019

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

Table

Я пытаюсь найти, какие случаи являются дубликатами, то есть, какие случаи имеют одну и ту же группу, параметр1, параметр2, параметр3 Я пытался использовать декартово произведение, но тогда я не знал, имеют ли эти случаи одинаковое количество строк (поскольку в предложении where я беру только одинаковые, как здесь:

where a.group=b.group
and a.parameter1=b.parameter1
and a.parameter2=b.parameter2
and a.parameter3=b.parameter3
and a.case!=b.case

) и если все они одинаковы.

Кто-нибудь работал над чем-то похожим и может иметь решение для этого?

Ответы [ 4 ]

0 голосов
/ 01 марта 2019

Это может немного прояснить или запутать то, что написали мои предшественники.

Это SQL.И Vertica является одной из баз данных, которые поддерживают стандарт ANSI 2003, та, которая имеет «оконные» функции, также называемые функциями OLAP.Это те, которые добавляют предложение OVER () после вызова функции.Как сказал Гордон выше - этот запрос на самом деле работает - и я просто вставляю ваши входные данные в первое общее табличное выражение - первый список записей исходного предложения WITH.

Вот так:

WITH -- your input ....
input(grp,caseno,p1,p2,p3) AS (
          SELECT 'A', 11,'x','x','x'
UNION ALL SELECT 'A', 12,'x','x','x'
UNION ALL SELECT 'C', 21,'x','x','y'
UNION ALL SELECT 'E',323,'y','y','y'
UNION ALL SELECT 'E', 43,'y','y','y'
)
,
find_dups AS (
  SELECT
    *
  , COUNT(*) OVER(PARTITION BY grp,p1,p2,p3) AS occ_count
  FROM input
)
SELECT * FROM find_dups;
-- out  grp | caseno | p1 | p2 | p3 | occ_count 
-- out -----+--------+----+----+----+-----------
-- out  A   |     11 | x  | x  | x  |         2
-- out  A   |     12 | x  | x  | x  |         2
-- out  C   |     21 | x  | x  | y  |         1
-- out  E   |    323 | y  | y  | y  |         2
-- out  E   |     43 | y  | y  | y  |         2
-- out (5 rows)
-- out 
-- out Time: First fetch (5 rows): 17.462 ms. All rows formatted: 17.514 ms

И: с этого момента вы можете фильтровать по 'occ_count', идентифицировать наибольшее количество упорядоченных дубликатов по occ_count или как вам нужно.

0 голосов
/ 28 февраля 2019

Я не уверен, что это самый простой способ сделать это, но он работает для меня. Вы запускаете запрос, чтобы найти данные, с которыми хотите сравнить, и второй запрос в первом для результата ...

<?php 

//Retrieves data from MySQL for First Time
$data_p = mysql_query("SELECT * FROM TABLE") or die(mysql_error()); 

 //Puts it into an array 
 while($info = mysql_fetch_array( $data_p )) 
 {
$parameter1_bs=$info['parameter1'];
$parameter2_bs=$info['parameter2'];
$parameter3_bs=$info['parameter3'];


//Retrieves data from MySQL to compare with the previous result 
$data_po = mysql_query("SELECT * FROM TABLE WHERE $parameter1_bs=parameter1 AND $parameter2_bs=parameter2 AND $parameter3_bs=parameter3") or die(mysql_error()); 
$row = mysql_num_rows($data_po); // $row will count how many results

 //Puts it into an array 
 while($info = mysql_fetch_array( $data_pp )) 
 {
$case=$info['case'];
echo $case;
echo "<br>";
}}

?>
0 голосов
/ 28 февраля 2019

Использование оконных функций!

select t.*
from (select t.*,
             count(*) over (partition by Group, parameter1, parameter2, parameter3) as cnt
      from t
     ) t
where cnt > 1
order by Group, parameter1, parameter2, parameter3;

Вы можете получить значения ключей, которые являются дубликатами, с простым агрегированием:

select Group, parameter1, parameter2, parameter3, count(*)
from t
group by Group, parameter1, parameter2, parameter3
having count(*) > 1;
0 голосов
/ 28 февраля 2019

вы можете попробовать, используя exists

   select t1.* from table_name t1
    where exists  ( select 1 from table_name t2 where t1.parameter1=t2.parameter1
                                              and t1.parameter2=t2.parameter2
                                              and t1.parameter3=t2.parameter3
                                        having count(*)>1
                  )
...