2014-02-02 4 views
0

Я пытаюсь посчитать строки, как в этой таблице:Postgresql: Количество строк с одинаковым значением, но в другом порядке

Product | Product2 | Value 
Coke | Lemon | 3 
Coke | Potato | 4 
Coke | Seven Up | 10 
Lemon | Coke  | 3 
Lemon | Meat  | 4 
Pancake | Meat  | 23 
Potato | Coke  | 4 
Seven Up| Coke  | 10 
Meat | Lemon | 4 
Meat | Pancake | 23 

Я должен сосчитать предметы, но если они изменяют порядок, я все еще должен рассчитывать только один раз. Так что в этом случае у меня был бы результат: 5. Кстати, я уже пробовал «где Product! = Product2», но этого недостаточно.

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

+1

Можете ли вы объяснить, больше? 5 из чего? – Houari

+0

Например, мы подсчитываем строку: Coke | Лимон | 3. Тогда мы не должны снова считать Лимон | Кокс | 3, только потому, что Лимон сменил места с Кокой. Поэтому, применяя эту идею, учитывая эту таблицу, результат будет равен 5. Знаете ли вы, как я могу это сделать с помощью SQL? Спасибо, –

+0

Вы не ответили на вопрос Хуари: 5 что? Если вы имели в виду, что хотите подсчитать количество * отдельных продуктов *, то (а) их 6, и (б) почему бы не сказать это? –

ответ

2

основе This array sorting function, мы можем преобразовать строки к массивам, сортировки массива, и чем выбирать различные значения:

CREATE OR REPLACE FUNCTION array_sort (ANYARRAY) 
RETURNS ANYARRAY LANGUAGE SQL 
AS $$ 
SELECT ARRAY(SELECT unnest($1) ORDER BY 1) 
$$; 

и чем:

SELECT count(distinct array_sort(array[product, product2] )) FROM your_table 

Надежда, что помогает

+2

Это красиво обобщает на более чем два столбца продукта, где «величайший»/«наименее» трюк не работает: http://sqlfiddle.com/#!15/518b4/1 –

4

Поскольку у вас есть только две колонки, вы можете использовать greatest and least, чтобы игнорировать порядок столбцов:

select greatest(product, product2) as a, 
     least(product, product2) as b 
from t 
order by a, b 

даст вам:

Lemon | Coke 
Lemon | Coke 
Meat  | Lemon 
Meat  | Lemon 
Pancake | Meat 
Pancake | Meat 
Potato | Coke 
Potato | Coke 
Seven Up | Coke 
Seven Up | Coke 

Затем бросьте в distinct и count:

select count(
    distinct (
    greatest(product, product2), 
    least(product, product2) 
) 
) 
from t 

Демо: http://sqlfiddle.com/#!15/32111/6

+0

Отлично работает, как и ожидалось. Благодаря, –

Смежные вопросы