SQL 计算数据集中的出现次数,但变量值无法交换
SQL count occurrence in the dataset, but the variable value coud swap
我对我的 SAS on demand sql 程序有疑问。
原始数据集如下所示:
Obs From To
------------------------
1 A B
2 A C
3 B A
4 C A
5 E C
6 C A
问题是我不关心 From 和 To 中出现的内容,我只关心它们都出现了多少次。
我需要这样的输出:
A B occured(no matter what order): 2
A C occured(no matter what order): 3
C E occured(no matter what order): 1
你没有提到你正在使用什么 rdbms,但大多数都有你可以使用的 least
和 greatest
功能,所以你总是得到 "smaller"左边的值。例如:
SELECT LEAST(lista, listb) || '&' || GREATEST(lista, listb), COUNT(*)
FROM mytable
GROUP BY LEAST(lista, listb), GREATEST(lista, listb)
并非所有数据库都支持 least()
和 greatest()
。你可以这样写:
select (case when lista < listb then lista else listb end),
(case when lista < listb then listb else lista end),
count(*)
from t
group by (case when lista < listb then lista else listb end),
(case when lista < listb then listb else lista end);
如果你想把它作为一个字符串:
select ((case when lista < listb then lista else listb end) || '&' ||
(case when lista < listb then listb else lista end)
),
count(*)
from t
group by (case when lista < listb then lista else listb end),
(case when lista < listb then listb else lista end);
这个SQL
SELECT CONCAT(A, B) as CAB, COUNT(*) from(SELECT greatest(A,B) as A, least(A,B) as B FROM original_table)s GROUP BY CAB
得到你想要的结果。
因为看起来您正在使用 SAS,这里是您可以使用的语法。
proc sql;
create table want as
select min(from,to) as first
, max(from,to) as second
, count(*) as count
from have
group by 1,2
;
quit;
我对我的 SAS on demand sql 程序有疑问。
原始数据集如下所示:
Obs From To
------------------------
1 A B
2 A C
3 B A
4 C A
5 E C
6 C A
问题是我不关心 From 和 To 中出现的内容,我只关心它们都出现了多少次。
我需要这样的输出:
A B occured(no matter what order): 2
A C occured(no matter what order): 3
C E occured(no matter what order): 1
你没有提到你正在使用什么 rdbms,但大多数都有你可以使用的 least
和 greatest
功能,所以你总是得到 "smaller"左边的值。例如:
SELECT LEAST(lista, listb) || '&' || GREATEST(lista, listb), COUNT(*)
FROM mytable
GROUP BY LEAST(lista, listb), GREATEST(lista, listb)
并非所有数据库都支持 least()
和 greatest()
。你可以这样写:
select (case when lista < listb then lista else listb end),
(case when lista < listb then listb else lista end),
count(*)
from t
group by (case when lista < listb then lista else listb end),
(case when lista < listb then listb else lista end);
如果你想把它作为一个字符串:
select ((case when lista < listb then lista else listb end) || '&' ||
(case when lista < listb then listb else lista end)
),
count(*)
from t
group by (case when lista < listb then lista else listb end),
(case when lista < listb then listb else lista end);
这个SQL
SELECT CONCAT(A, B) as CAB, COUNT(*) from(SELECT greatest(A,B) as A, least(A,B) as B FROM original_table)s GROUP BY CAB
得到你想要的结果。
因为看起来您正在使用 SAS,这里是您可以使用的语法。
proc sql;
create table want as
select min(from,to) as first
, max(from,to) as second
, count(*) as count
from have
group by 1,2
;
quit;