sql:以列格式从 table 中获取 3 个最大值

sql: Getting 3 highest values from table in column format

我有一个具有以下结构的 table(我们称它为我的table)。 table 每天记录近 100 万行。

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

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

如果您可以接受,最简单的方法可能是使用 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;

这会将三个值放入一个列中。如果愿意,您实际上可以将它们分成单独的列。

否则,您需要枚举这些值,这会变得很复杂——对于单个查询,您需要一个 subquery/non-equijoin(对于您的数据量而言可能非常昂贵)或变量。