sql:以列格式从表中获取3个最高值

时间:2015-06-17 11:59:56

标签: mysql innodb

我有一个表格(让我们称之为mytable),结构如下。该表每天记录接近1百万行。

id      date      timestamp  licenseid   storeid    deviceid    value
1     2015-06-12   17:36:15   lic0001       1         0add      52
2     2015-06-12   17:36:15   lic0002       1         0add      54
3     2015-06-12   17:36:15   lic0003       1         0add      53
4     2015-06-12   17:36:21   lic0001       1         0add      54
5     2015-06-12   17:36:21   lic0002       1         0add      59
6     2015-06-12   17:36:21   lic0003       1         0add      62
7     2015-06-12   17:36:21   lic0004       1         0add      55
8     2015-06-12   17:36:15   lic0001       1         0bdd      53
9     2015-06-12   17:36:15   lic0002       1         0bdd      52
10    2015-06-12   17:36:15   lic0003       1         0bdd      52
11    2015-06-12   17:36:15   lic0004       1         0bdd      50
12    2015-06-12   17:36:33   lic0002       1         0bdd      54
13    2015-06-12   17:36:33   lic0003       1         0bdd      54
14    2015-06-12   17:36:33   lic0004       1         0bdd      55
15    2015-06-12   17:36:33   lic0005       1         0bdd      60

我需要使用上面相同的数据并获取如下数据。我应该使用什么SQL查询来获得以下输出,但我只想要相应设备的三个最高值。我知道我需要使用数据透视表,但我在构建正确的查询时遇到了困难

id   date      timestamp   deviceid  storeid  deviceid1  deviceid2   deviceid3  value1   value2   value3  
1  2015-06-12   17:36:15     0add      1        lic001     lic002     lic003      52       54       53     
2  2015-06-12   17:36:21     0add      1        lic002     lic003     lic004      59       62       55
3  2015-06-12   17:36:15     0bdd      1        lic001     lic002     lic003      53       52       52      
4  2015-06-12   17:36:33     0bdd      1        lic002     lic004     lic005      54       55       60

对于最后一行,查询可以返回lic002或lic003,因为两个值都相同。

1 个答案:

答案 0 :(得分:1)

如果您可以接受,最简单的方法可能是使用group_concat()substring_index()

select min(id) as id, date, timestamp, storeid,
       substring_index(group_concat(device order by value desc), ',', 3) as devices,
       substring_index(group_concat(value order by value desc), ',', 3) as values
from mytable t
group by date, timestamp, storeid;

这将三个值放在一列中。实际上,如果愿意,您可以将它们分成不同的列。

否则,您需要枚举值并且变得复杂 - 使用单个查询,您需要子查询/非等值连接(可能在您的数据大小上非常昂贵)或变量。