2009-06-18 6 views
0

У меня есть таблица вроде этого:MySQL Query

col1 col2 

2001 3001 
2002 3001 
2003 3001 
2004 3002 
2002 3003 
2001 3003 

я хочу создать его запрос, который выясняет все комбинации элементов в col1 с определенной позиции в col1, если они происходят в одной и той же позиции в col2 и частота появления. Например, если мы хотим, чтобы изучить номер пункта «2001» в COL1 запрос должен возвращать:

col3 col4 col5 
2001 2002 0.667 
2001 2003 0.333 

Может кто-нибудь дать мне подсказку? Спасибо заранее.

+1

Это не имеет никакого смысла для меня, можете ли вы перефразировать вопрос? –

+0

Правильны ли ваши данные col2 в первом блоке? – northpole

+0

данные примера и желаемые результаты не имеют смысла - 2001 в два раза встречается в col1 в примере, соответствующие значения col2 равны 3001 и 3003, после каждого - никакого отношения вообще с желаемым выходом. –

ответ

1

Думая об этом так, вы пытаетесь связать таблицу с самой собой через col2, поэтому мы начнем с присоединиться на себя:

select left.col1, right.col1/*, ...*/ from table left inner join table right on left.col2 = right.col2 where left.col1 = '2001' /* ... */ 

Теперь для вашего агрегата. Вы хотите, чтобы объединить все right.col1, чтобы получить количество для этого столбца:

select left.col1, right.col1, COUNT(*) from table left inner join table right on left.col2 = right.col2 where left.col1 = '2001' group by right.col2 

Что я считаю, должен выйти с сырыми подсчетами. Я считаю, что вам придется прокручивать запрос и получить общее количество, чтобы получить частоту.

Как примечание, это было бы намного сложнее, если col1 не были постоянными.

Edited добавить: Если вы ищете один запрос, а не перебор над ним на любом языке, вы запрашиваете от, вы должны были бы сделать это группировкой дважды:

SELECT abs_freq.col1, abs_freq.col2, abs_freq.freq/totals.total 
FROM (SELECT 
     left.col1 AS col1, 
     COUNT(*) AS total 
     FROM TABLE LEFT 
     INNER JOIN TABLE RIGHT 
     ON left.col2 = right.col2 
     WHERE left.col1 = '2001' 
     GROUP BY left.col1 
    ) totals 
INNER JOIN (SELECT 
       left.col1 AS col1, 
       right.col1 AS col2, 
       COUNT(*) AS freq 
      FROM TABLE LEFT 
      INNER JOIN TABLE RIGHT 
       ON left.col2 = right.col2 
      WHERE left.col1 = '2001' 
      GROUP BY right.col2 
      ) abs_freq 
    ON abs_freq.col1 = totals.col1 
+0

Не могли бы вы объяснить мне более подробно о том, как получить частоту? –

+0

Результат возвращает три столбца. Третий столбец в запросе выше - количество вхождений в абсолютных выражениях, поэтому у вас будет 2002 -> 2 и 2003 -> 1. Чтобы получить частоту, на любом языке, который вы используете, получите общее количество (2 + 1), затем разделите столбец на общую сумму (2002 -> 2/(2 + 1) = 0,667, 2003 -> 1/(2 + 1) = 0,333) –

+0

Я использую следующий запрос: select C.tagid1, C .tagid2, C.partial * 1.0/sum (C.partial) from (выберите A.tagid tagid1, B.tagid tagid2, count (*) частично из основного внутреннего внутреннего соединения B на A.itemid = B. itemid , где A.tagid! = B.tagid AND A.tagid = 2001 группа B.tagid) как C; Однако, это только возвращает мне одну строку из-за функции суммы. У вас есть идея, как это исправить? –