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

Mysql 如何从X列中选择唯一列,但在SQL中从结果中显示X+Y列?,mysql,sql,impala,Mysql,Sql,Impala,这个表位于我们的impala集群上,不过,impala shell似乎非常类似于SQL。除了做非常简单的查询之外,我几乎没有SQL或Impala方面的经验,所以这个问题可能远远超出我的经验和薪资等级 我需要使用impala从数据库中获取一些数据。表中还有其他列,但我的命令捕获了我感兴趣的这3列。数据/结果可以如下所示: time | server | data 0 | A | 500 0 | B | 200 0 | C | 300 1 |

这个表位于我们的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,其中每个服务器对于每个时间值只显示一次。但是,有一个bug,如图所示,服务器可以针对一个时间值显示多次。而且,也不是同一台服务器在每个时间值上显示多次,如上面的示例所示

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

select distinct time, server from table;

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

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

SELECT TIME, SERVER, MAX(DATA)
  FROM TABLE
  GROUP BY TIME, SERVER
  ORDER BY TIME, SERVER;
希望这有帮助


共享和享受。

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

SELECT TIME, SERVER, MAX(DATA)
  FROM TABLE
  GROUP BY TIME, SERVER
  ORDER BY TIME, SERVER;
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)
希望这有帮助


共享和享受。

如果有多个时间+服务器对,那么必须返回哪一行的数据?@zerkms,thx,谢谢您的关注和帮助。如果可能的话,我想打印出更大的值,比如对于服务器A,时间=1,我想打印出400。如果太复杂,那么我只列出时间/服务器对遇到的第一个值。如果有几个时间+服务器对,那么必须返回哪一行的数据?@zerkms,thx,谢谢您的关注和帮助。如果可能的话,我想打印出更大的值,比如对于服务器A,时间=1,我想打印出400。如果太复杂,那么我只列出我们遇到的时间/服务器对的第一个值。这个特定的ORDER BY在GROUP BY中是隐式的,目前在MySQL中可能是这样,但在其他DBMS中肯定不是这样。根据我的经验,将ORDER BY与GROUP BY一起添加是一个需要培养的好习惯——当我们从Oracle 9升级到Oracle 10时,这将为我的公司节省几个月的工作时间。这是真的吗?很高兴认识你。计划升级时,在测试10g时发现了它。不是艰苦的工作,而是漫长、乏味,而且……乏味。每次使用GROUP BY时,下订单要容易得多:-这个特殊的orderby在组bys中是隐式的,目前在MySQL中可能是这样,但在其他DBMS中肯定不是这样。根据我的经验,将ORDER BY与GROUP BY一起添加是一个需要培养的好习惯——当我们从Oracle 9升级到Oracle 10时,这将为我的公司节省几个月的工作时间。这是真的吗?很高兴认识你。计划升级时,在测试10g时发现了它。不是艰苦的工作,而是漫长、乏味,而且……乏味。每次使用GROUP BY时,下订单要容易得多:-
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)