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(对于您的数据量而言可能非常昂贵)或变量。
我有一个具有以下结构的 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(对于您的数据量而言可能非常昂贵)或变量。