【问题标题】:Get whole dataset for each unique combination of two columns and their max and min values为两列的每个唯一组合及其最大值和最小值获取整个数据集
【发布时间】:2017-11-09 04:06:40
【问题描述】:

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

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

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

的查询以编程方式执行此操作
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

【问题讨论】:

  • 请发布示例数据集和所需的输出。
  • 做“groupwise max”很麻烦。查看我添加的标签。
  • @RickJames 将调查这些问题,感谢您的意见

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


【解决方案1】:

如果您知道您的两列值:这将是当 col3 为最大值且 col 4 在这两个列值处最小值时的数据集。请记住,您对查询的约束是两列值。复合查询应该是这样的:

 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)";

【讨论】:

    【解决方案2】:

    应该这样做:

    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
    

    【讨论】:

    • 感谢先生的回答。终极8。很抱歉这么晚才回复你的回答,我没有时间工作(我是一名在职学生,过去几周忙于大学工作)。您的答案几乎是正确的,“AND A.col3 = B.MAX_col3 AND A.col4 = B.MIN_col4”不会给出任何结果。如果你把它改成 AND (A.col3 = B.MAX_col3 OR A.col4 = B.MIN_col4) 我会接受你的回答。
    猜你喜欢
    • 2015-05-30
    • 2017-06-11
    • 2015-09-29
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    相关资源
    最近更新 更多