Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql:对具有相同值但顺序不同的行进行计数_Sql_Postgresql - Fatal编程技术网

Postgresql:对具有相同值但顺序不同的行进行计数

Postgresql:对具有相同值但顺序不同的行进行计数,sql,postgresql,Sql,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

我正在尝试计算如下表中的行:

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。 顺便说一下,我已经尝试过“where Product!=Product2”,但这还不够

有人能告诉我在这种情况下该怎么办吗?谢谢,

基于,我们可以将行转换为数组,对数组进行排序,然后选择不同的值:

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
希望对您有所帮助基于,我们可以将行转换为数组,对数组进行排序,然后选择不同的值:

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

希望对您有所帮助

因为您只有两列,您可以使用忽略列顺序:

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
然后抛出一个
不同的
计数

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

演示:

由于您只有两列,因此可以使用忽略列顺序:

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
然后抛出一个
不同的
计数

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

演示:

您能解释一下吗?什么中的5个?例如,我们数了一排:可乐、柠檬、3个。那我们就不能再数柠檬可乐了,因为柠檬跟可乐换了位置。所以应用这个想法,考虑这个表,结果是5。您知道如何使用SQL来完成吗?谢谢,你没有回答Houari的问题:5什么?如果你想计算不同产品的数量,那么(a)有6个,以及(b)为什么不这么说?@j_random_hacker:不同的无序对,即不同的
(产品,产品1)
对,其中
(a,b)
(b,a)
被认为是相同的。你能解释更多吗?什么中的5个?例如,我们数了一排:可乐、柠檬、3个。那我们就不能再数柠檬可乐了,因为柠檬跟可乐换了位置。所以应用这个想法,考虑这个表,结果是5。您知道如何使用SQL来完成吗?谢谢,你没有回答Houari的问题:5什么?如果你想计算不同产品的数量,那么(a)有6个,以及(b)为什么不这么说?@j_random_hacker:不同的无序对,即不同的
(产品,产品1)
对,其中
(a,b)
(b,a)
被认为是相同的。这很好地推广到两个以上的产品列,其中
最大的
/
最小的
技巧不起作用:这很好地推广到两个以上的产品列,其中
最大的
/
最小的
技巧不起作用: