SQL-запрос для поиска уникальных значений в нескольких группах - PullRequest
1 голос
/ 20 марта 2012

Итак, у меня есть таблица в формате:

Имя, URL, xpath, значение

Проблема в том, что имена A, B и F имеют одинаковые URL U1 и xpath X1 (не заботятся о значении).

У имен C, D, E нет того URL U1 или xpath X1 не было.

Имена B, C, D, E могут совместно использовать U2 и X2

Я пытаюсь найти лучший способ узнать, где URL и xpath существуют во всех именах (A-F).

Я не знал, должен ли я создать временную таблицу со всеми уникальными значениями, где совпадают URL и xpaths. затем используйте эту временную таблицу, чтобы просмотреть все имена, и если у всех имен есть этот URL и Xpath, затем добавьте его во вторую временную таблицу, тогда я просто верну все результаты из окончательной временной таблицы.

Спасибо!

Вот некоторые примеры данных:

Имя, URL, Xpath, значение

Джон, /MyAttributes.xml, / attribute / arms, 2

Джон, /MyAttributes.xml, / attribute / leg, 2

Джон, /MyQualities.xml, / Quality / Раса, человек

Дерек, /MyAttributes.xml, / attribute / leg, 2 Дерек, /MyQualities.xml, / Quality / Раса, не человек

Таким образом, имена могут вырасти до сотен имен, и информация, которую я пытаюсь собрать, заключается в том, что "/MyAttributes.xml, / attribute / leg" существует как в John & Derek, так и по мере увеличения базы данных я все еще нужно иметь возможность видеть, какой URL с xpath существует во всех именах.

Надеюсь, это поможет предоставить больше данных.

Ответы [ 4 ]

1 голос
/ 20 марта 2012

Вот вариант ответа, представленного Марком Баннистером:

SELECT t.url
FROM
   myTable t
     CROSS JOIN (SELECT COUNT(DISTINCT name) AS cnt FROM myTable) x
GROUP BY t.url
HAVING COUNT(DISTINCT t.name) = MAX(x.cnt);
1 голос
/ 20 марта 2012

Попробуйте это:

select 
   url,
   xpath
from table
group by
   url,
   xpath
having
   max(case when name='A' then
         1
       else
         0
       end) +
   max(case when name='B' then
         2
       else
         0
       end) +
   max(case when name='C' then
         4
       else
         0
       end) +
   max(case when name='D' then
         8
       else
         0
       end) +
   max(case when name='E' then
         16
       else
         0
       end) +
   max(case when name='F' then
         32
       else
         0
       end) = 63;
0 голосов
/ 23 марта 2012

Так вот, что я в итоге и сделал. Спасибо всем, кто помог. Если вы знаете хороший способ оптимизировать это, это было бы УДИВИТЕЛЬНО.

Подводя итог, я в итоге создал временную таблицу. Затем я прохожу все уникальные результаты. и посмотрите, существует ли этот url + xpath для всех уникальных имен. затем, если это так, я вставляю его в свою временную таблицу, где я просто выкидываю это в конце.

    BEGIN
    DECLARE bDone INT;

      DECLARE var1 VARCHAR(845);
      DECLARE var2 VARCHAR(45);
      DECLARE var3 VARCHAR(800);

      DECLARE curs CURSOR FOR SELECT DISTINCT CONCAT(url, xpath), url, xpath FROM myTable;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;


      DROP TEMPORARY TABLE IF EXISTS tblResults;
      CREATE TEMPORARY TABLE IF NOT EXISTS tblResults  (
        url VARCHAR(45),
        xpath VARCHAR(800)
      );
      OPEN curs;
      SET bDone = 0;
      REPEAT
        FETCH curs INTO var1, var2, var3;
        IF 
            (

            SELECT 
                COUNT(DISTINCT name) 
             FROM myTable as l 
             WHERE 
                l.url = var2 AND 
                l.xpath = var3
            ) = (

            SELECT 
                COUNT(DISTINCT name) 
                FROM myTable
            ) THEN

           INSERT INTO tblResults VALUES (var2, var3);
        END IF;
      UNTIL bDone END REPEAT;

      CLOSE curs;
      SELECT * FROM tblResults;
    END
0 голосов
/ 20 марта 2012

Чтобы найти все URL, которые существуют для всех имен, попробуйте:

select url
from myTable
group by url
having count(distinct name) = (select count(distinct name) from myTable)

Чтобы найти xpath, которые существуют для всех имен, поменяйте местами xpath и url в приведенном выше запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...