如何从 X 列中选择唯一列,但从 SQL 的结果中显示 X + Y 列?

Posted

技术标签:

【中文标题】如何从 X 列中选择唯一列,但从 SQL 的结果中显示 X + Y 列?【英文标题】:How to select unique columns from X columns but show X + Y columns from the results in SQL? 【发布时间】:2015-01-29 23:44:46 【问题描述】:

该表在我们的 impala 集群上,尽管 impala shell 看起来与 SQL 非常相似。除了执行极其简单的查询之外,我几乎没有 SQL 或 Impala 经验,所以这个问题可能远远超出我的经验和薪酬等级。

我需要使用 impala 从我们的数据库中获取一些数据。表中还有其他列,但我的命令抓取了我感兴趣的这 3 列。数据/结果可能如下所示:

time | server | data
  0  |   A    | 500
  0  |   B    | 200
  0  |   C    | 300
  1  |   A    | 100
  1  |   A    | 400
  1  |   B    | 200
  1  |   C    | 300
  2  |   A    | 900
  2  |   B    | 800
  2  |   C    | 700
  2  |   C    | 600

理想情况下,数据应该看起来像时间 0,其中每个服务器只针对每个时间值显示一次。但是,有一个错误,如图所示,服务器可以多次显示时间值。如上例所示,每个时间值显示多次的服务器也不是同一台服务器。

无论如何,我应该阅读/查找什么 impala-shell/SQL 命令来告诉它选择不同的时间和服务器,但选择两个数据值中的较大者?我不知道如何继续过去:

select distinct time, server from table;

如果这太难或太复杂,也许有人可以指点我一个命令,该命令选择不同的时间和服务器,但打印它为不同的时间和服务器对找到的数据的第一个值。

【问题讨论】:

如果有多个time + server对,data必须从哪一行返回? @zerkms,感谢您的关注和帮助。如果可能的话,我想打印出更大的值,比如服务器 A 的时间 = 1,我想打印出 400。 如果太复杂,我就列出我们遇到的时间/服务器对的第一个值。 【参考方案1】:

要获取唯一时间和服务器值以及最大数据值,您可以使用带有GROUP BY 的查询,如下所示:

SELECT TIME, SERVER, MAX(DATA)
  FROM TABLE
  GROUP BY TIME, SERVER
  ORDER BY TIME, SERVER;

希望这会有所帮助。

分享和享受。

【讨论】:

这个特定的 ORDER BY 隐含在 GROUP BY 中 目前在 mysql 中可能是这样,但在其他 DBMS 中肯定不是这样。根据我的经验,添加 ORDER BY 和 GROUP BY 是一个值得培养的好习惯 - 当我们从 Oracle 9 升级到 Oracle 10 时,它可以为我的公司节省几个月的工作量。YMMV。 这是真的吗?很高兴知道 是的。在计划升级时测试 10g 时发现它。不是艰苦的工作,而是漫长的、乏味的,而且……乏味的。每次使用 GROUP BY 时,更容易放入 ORDER BY。 :-)【参考方案2】:
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> create table test_tabl(time int, server varchar(10), data int);
Query OK, 0 rows affected (0.03 sec)

mysql> insert into test_tabl values(0, 'A', 500), (0, 'B', 200), (0, 'C', 300);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> insert into test_tabl values(1, 'A', 100), (1, 'A', 400), (1, 'B', 200), (1, 'C', 300);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> insert into test_tabl values(2, 'A', 900), (2, 'B', 800), (2, 'C', 700), (2, 'C', 600);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from test_tabl;
+------+--------+------+
| time | server | data |
+------+--------+------+
|    0 | A      |  500 |
|    0 | B      |  200 |
|    0 | C      |  300 |
|    1 | A      |  100 |
|    1 | A      |  400 |
|    1 | B      |  200 |
|    1 | C      |  300 |
|    2 | A      |  900 |
|    2 | B      |  800 |
|    2 | C      |  700 |
|    2 | C      |  600 |
+------+--------+------+
11 rows in set (0.00 sec)

mysql>
mysql> select time, server, max(data) from test_tabl group by time, server;
+------+--------+-----------+
| time | server | max(data) |
+------+--------+-----------+
|    0 | A      |       500 |
|    0 | B      |       200 |
|    0 | C      |       300 |
|    1 | A      |       400 |
|    1 | B      |       200 |
|    1 | C      |       300 |
|    2 | A      |       900 |
|    2 | B      |       800 |
|    2 | C      |       700 |
+------+--------+-----------+
9 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

【讨论】:

以上是关于如何从 X 列中选择唯一列,但从 SQL 的结果中显示 X + Y 列?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据唯一列和单独列中的最高量过滤结果集?

如何在 DolphinDB 表的列中选择唯一元素?

如果行在其他列中具有相同的数据,则 SQL 查询 CONCAT/列出唯一列数据?

使用 Pyspark 或 SQL 从图像列中查找唯一图像名称

如何从 SQL 中包含多个列的报表中的列中选择最近的项目?

从同一个表中的多个列中选择不同的值