我必须创建一个查询,它将在几列整数类型上显示已使用的数字和使用的时间。
为此我创建了一个小例子表,其中的代码适合粘贴到pgAdmin的sql编辑器中:
DROP TABLE IF EXISTS mynums;
CREATE TABLE mynums
(rowindex serial primary key, mydate timestamp, num1 integer, num2 integer, num3 integer);
INSERT INTO mynums (rowindex, mydate, num1, num2, num3)
VALUES (1, '2015-03-09 07:12:45', 1, 2, 3),
(2, '2015-03-09 07:17:12', 4, 5, 2),
(3, '2015-03-09 07:22:43', 1, 2, 4),
(4, '2015-03-09 07:25:15', 3, 4, 5),
(5, '2015-03-09 07:41:46', 2, 5, 4),
(6, '2015-03-09 07:42:05', 1, 4, 5),
(7, '2015-03-09 07:45:16', 4, 1, 2),
(9, '2015-03-09 07:48:38', 5, 2, 3),
(10, '2015-03-09 08:15:44', 2, 3, 4);
请帮助构建一个查询,该查询将使用次数按次数排列的列号num1,num2和num3中的已用数字和已用时间的结果。
结果应该是:
number times
2 7
4 7
1 4
3 4
5 5
答案 0 :(得分:2)
您需要将列转换为行才能聚合它们:
select number, count(*)
from (
select num1 as number
from mynums
union all
select num2
from mynums
union all
select num3
from mynums
) t
group by number
order by number;
通常,像num1,num2,num3这样的列是可疑数据库设计的标志。如果您需要添加更多数字会怎样?最好创建一对多关系,并将与rowindex
关联的数字存储在单独的表中。
答案 1 :(得分:1)
这样可行:
select number, count(*) as times
FROM (
select rowindex, mydate, num1 as number FROM mynums
UNION ALL
select rowindex, mydate, num2 FROM mynums
UNION ALL
select rowindex, mydate, num3 FROM mynums
) as src
group by number
order by count(*) desc, number