PostgreSQL在多个列上选择

PostgreSQL在多个列上选择,postgresql,Postgresql,我必须做一个查询,它将显示整数类型的几列上使用的数字和使用的时间 为此,我制作了一个小示例表,其中的代码适合粘贴到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, m

我必须做一个查询,它将显示整数类型的几列上使用的数字和使用的时间

为此,我制作了一个小示例表,其中的代码适合粘贴到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

您需要将列转换为行,以便能够聚合它们:

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等列是数据库设计有问题的标志。如果需要添加更多数字,会发生什么情况?最好创建一对多关系,并将与
行索引关联的数字存储在单独的表中。

您需要将列转换为行,以便能够聚合它们:

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等列是数据库设计有问题的标志。如果需要添加更多数字,会发生什么情况?最好创建一对多关系,并将与
行索引关联的数字存储在单独的表中。

您需要将列转换为行,以便能够聚合它们:

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等列是数据库设计有问题的标志。如果需要添加更多数字,会发生什么情况?最好创建一对多关系,并将与
行索引关联的数字存储在单独的表中。

您需要将列转换为行,以便能够聚合它们:

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等列是数据库设计有问题的标志。如果需要添加更多数字,会发生什么情况?最好创建一对多关系,并将与
行索引相关联的数字存储在单独的表中。

这将起作用:

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

这将起作用:

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

这将起作用:

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

这将起作用:

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

“有问题的数据库设计”,我的2个同事也是:-)非常感谢“一个名字”,工作如期。在这种情况下,固定数量的列现在是可以接受的,但对于类似的情况,我会记住您的建议。“有问题的数据库设计”,我的2个要点也是:-)非常感谢“一个名字”,按预期工作。在这种情况下,固定数量的列现在是可以接受的,但对于类似的情况,我会记住您的建议。“有问题的数据库设计”,我的2个要点也是:-)非常感谢“一个名字”,按预期工作。在这种情况下,固定数量的列现在是可以接受的,但对于类似的情况,我会记住您的建议。“有问题的数据库设计”,我的2个要点也是:-)非常感谢“一个名字”,按预期工作。在这种情况下,固定列数现在是可以接受的,但对于类似的情况,我会记住您的建议。感谢murison,您的解决方案也可以工作,但“名称”更快。感谢murison,您的解决方案也可以工作,但“名称”更快。感谢murison,您的解决方案也可以工作,但“名字”更快。