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

时间:2015-01-29 23:44:47

标签: mysql sql impala

这个表在我们的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;

如果这太难或太复杂,也许某人可以指向一个选择不同时间和服务器的命令,但会为不同的时间和服务器对打印出第一个数据值。

2 个答案:

答案 0 :(得分:4)

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

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

希望这有帮助。

分享并享受。

答案 1 :(得分:1)

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)