获取两列唯一组合及其最大值和最小值的整个数据集

时间:2017-06-07 17:06:41

标签: mysql sql mariadb greatest-n-per-group

我正在拼命搜索一个查询,该查询为我提供了以下查询的所有数据集:

SELECT col1, col2, MAX(col3), MIN(col4) FROM table1 GROUP BY col1, col2

这将返回一个表,如下所示

col 1  | col2   | max(col3) | min(col4)
------ | ------ | --------- | ------ 
10     | 0.5    | 20        | -5
10     | 0.9    | 30        | -2

我需要的是每个max和min以及每个实体的数据集(整行)。我可以使用类似

的查询以编程方式执行此操作
SELECT * FROM table1 WHERE col1 = 10 AND (col2 = 0.5 OR col2 = 0.9) AND ((col3 = 20 OR col4 = -5) OR (col3 = 30 OR col4 = -2 ))

返回4个数据集,

但是每次添加MAX或MIN或GROUP BY时,查询会变得更加丑陋(这是用户对程序的处理方式)。

让我试着用一句话解释一下:我正在寻找一种方法,将数据集显示给col1和col2的每个唯一值组合的每个最大值和最小值(不是col1,col2)。

有没有办法在一个查询中执行此操作?

如果您需要进一步的细节,请不要担心发表评论。

编辑1

数据集

id   | col 1  | col2   | col3   | col4
---- | ------ | ------ | ------ | ------ 
  0  |   10   |  0.5   |  20    |  0
  1  |   10   |  0.5   |  15    | -1
  2  |   10   |  0.5   |  17    | 12
  3  |   10   |  0.5   |  11    |  3
  4  |   10   |  0.5   |   5    | -5
  5  |   10   |  0.9   |  10    |  1
  6  |   10   |  0.9   |  22    | -1
  7  |   10   |  0.9   |  15    | -2
  8  |   10   |  0.9   |  30    |  3

所需输出

id   |  col 1  | col2   | col3   | col4
---- |  ------ | ------ | ------ | ------ 
  0  |   10    |  0.5   |  20    |  0
  4  |   10    |  0.5   |  5     | -5
  7  |   10    |  0.9   |  15    | -2
  8  |   10    |  0.9   |  30    |  3

2 个答案:

答案 0 :(得分:0)

如果您知道两个列值:这将是col3最大值时的数据集,而col3值是这两个列值的最小值。请记住,您对查询的约束是两列值。复合查询应该像:

 select * from table1 as A where col1 = '$value1' and col2 = '$value2' and    col3=(select MAX(col3) FROM table1 as B where A.col1 = B.col1 and A.col2 = B.col2) and col4=(select MIN(col4) FROM table1 as C where A.col1 = C.col1 and A.col2 = C.col2)";

答案 1 :(得分:0)

这应该这样做:

SELECT A.* FROM

table1 A

INNER JOIN

(SELECT 
col1, 
col2, 
MAX(col3) AS MAX_col3, 
MIN(col4) AS MIN_col4 
FROM table1 
GROUP BY 
col1, 
col2) B

ON A.col1 = B.col1
AND A.col2 = B.col2
AND A.col3 = B.MAX_col3
AND A.col4 = B.MIN_col4