我有一个表格(让我们称之为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,因为两个值都相同。
答案 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;
这将三个值放在一列中。实际上,如果愿意,您可以将它们分成不同的列。
否则,您需要枚举值并且变得复杂 - 使用单个查询,您需要子查询/非等值连接(可能在您的数据大小上非常昂贵)或变量。