MySQL分组列在两列上

时间:2013-05-28 09:35:09

标签: mysql sql

我有一张这样的表

+---------------------+-------+-----+
|       dateTime      | value |  id |
+---------------------+-------+-----+
| 2013-04-06 06:54:00 |  2.5  |  1  |
| 2013-04-06 06:55:00 |  2.9  |  2  |
| 2013-04-06 06:56:00 |  2.4  |  3  |
| 2013-04-06 06:57:00 |  2.6  |  4  |
| 2013-04-06 06:58:00 |  2.5  |  5  |
| 2013-04-06 06:59:00 |  2.6  |  6  |
| 2013-04-06 06:54:00 |  2.8  |  7  |
| 2013-04-06 06:55:00 |  2.5  |  8  |
| 2013-04-06 06:56:00 |  2.1  |  9  |
+---------------------+-------+-----+

我想在两列上应用group by,但下面的查询对我不起作用

SELECT * FROM table GROUP BY dateTime, value

我希望两列都有不同的值。 我也尝试了这个,但这个也没有用

SELECT distinct(dateTime),value,id FROM table GROUP BY value

我希望每列都是唯一的。 我想要的输出是

+---------------------+-------+-----+
|       dateTime      | value |  id |
+---------------------+-------+-----+
| 2013-04-06 06:54:00 |  2.5  |  1  |
| 2013-04-06 06:55:00 |  2.9  |  2  |
| 2013-04-06 06:56:00 |  2.4  |  3  |
| 2013-04-06 06:57:00 |  2.6  |  4  |
+---------------------+-------+-----+

任何人都可以帮我吗? 感谢

5 个答案:

答案 0 :(得分:1)

如果您需要在两列中都包含唯一值(排除具有dateTime或以前行中返回的值的行),请尝试此查询。

SELECT a.datetime, a.value, a.id FROM test a
WHERE NOT EXISTS
  (
     SELECT 1 FROM test b 
     WHERE b.id < a.id
       AND (a.datetime = b.datetime OR b.value = a.value)
  )

SQLFiddle

答案 1 :(得分:0)

使用分组谓词时,所选值必须为

a)用于对结果进行分组的值

b)群组功能(例如SUMAVGCOUNT ..)

做类似

的事情
SELECT dateTime, value FROM table GROUP BY dateTime, value  (order is not needed to be kept).

如果您做了类似

的事情
SELECT dateTime, value FROM table GROUP BY value

您可以以表格结尾,在value = 1行中,您将拥有3个或4个不同的dateTime值。这不是一个表,因此SQL无效。

答案 2 :(得分:0)

如果您希望两列都是唯一的,则可以使用GROUP或DISTINCT:

<强> DISTINCT

SELECT DISTINCT dateTime, value FROM table

GROUP BY

SELECT dateTime, value FROM table GROUP BY dateTime, value

答案 3 :(得分:0)

你的问题不明确,所以让我这样问。

对于任何给定的日期/时间,存在多个条目,您需要第一次出现的值和ID。您的示例输出没有:58和59分钟的输入,所以我假设您不希望任何只有一条记录。

select
      YT2.dateTime,
      YT2.value,
      YT2.ID
   from
      ( select YT.dateTime, min(YT.id) MinID
           From YourTable YT
           group by YT.dateTime
           having count(*) > 1 ) as PreQuery
      JOIN YourTable YT2
         ON PreQuery.MinID = YT2.ID
        AND PreQuery.dateTime = YT2.dateTime

现在,如果您希望它基于具有最低VALUE的日期/时间,则上述查询只需要更改为

  ( select YT.dateTime, min(YT.Value) MinValue

     ON PreQuery.MinValue = YT2.Value

答案 4 :(得分:0)

你可以试试这个

SELECT dateTime, max(value) FROM table GROUP BY dateTime

这将为每个不同的dateTime提供一行,其中包含该组dateTime的最大值。您可以使用max()的替代方法,例如min()或sum()。

如果不确切知道自己想要达到的目标,就很难给出更准确的答案。