如何按特定顺序对结果进行分组?

How to group results on a specific order?

我有一个 VIEW,其中包含来自多个 table 的大量信息。在此视图中执行查询时,我需要通过列的值对结果进行分组。

我的主要问题是分组时结果没有按照我需要的顺序出现。我注意到,在对我的数据库进行分组时,它最终获得了它在指示的列中找到的第一个不同记录,并忽略了其余记录。

问题是,我需要包含分组词的最后一行。我已经尝试在进行分组之前进行排序,但即便如此我的数据库引擎似乎忽略了之前完成的排序。

以下面的table作为我的观点的例子,这是我的问题:

我怎么知道角色注册每种颜色的最后日期是哪一天?

也就是说,我需要所有 table 列按 DATE DESC 排序和按颜色分组。

+------+------------+-------+------------+
| id   | name       | color | date       |
+------+------------+-------+------------+
|    1 | SweetRobin | Green | 2017-01-01 |
|    2 | Tyrion     | Red   | 2017-02-01 |
|    3 | Sansa      | Grey  | 2017-03-01 |
|    4 | Ned        | Grey  | 2017-04-01 |
|    5 | Margaery   | Green | 2017-05-01 |
|    6 | Oberyn     | Red   | 2017-06-01 |
+------+------------+-------+------------+

根据我的经验,如果我使用

SELECT * FROM caracter GROUP BY color the output will be:
+------+------------+-------+------------+
| id   | name       | color | date       |
+------+------------+-------+------------+
|    1 | SweetRobin | Green | 2017-01-01 |
|    2 | Tyrion     | Red   | 2017-02-01 |
|    3 | Sansa      | Grey  | 2017-03-01 |
+------+------------+-------+------------+

但我真正需要的是:

+------+----------+-------+------------+
| id   | name     | color | date       |
+------+----------+-------+------------+
|    4 | Ned      | Grey  | 2017-04-01 |
|    5 | Margaery | Green | 2017-05-01 |
|    6 | Oberyn   | Red   | 2017-06-01 |
+------+----------+-------+------------+

如果我正确理解你要做什么,你可以试试

SELECT c.*
  FROM (
  SELECT color, MAX(date) date
    FROM caracter
   GROUP BY color
) q JOIN caracter c 
    ON q.color = c.color 
   AND q.date = c.date
 ORDER BY id

我们的想法是,您首先获取每种颜色的最大日期,然后返回以获取所有其他列。

输出:

+------+----------+-------+------------+
| id   | name     | color | date       |
+------+----------+-------+------------+
|    4 | Ned      | Grey  | 2017-04-01 |
|    5 | Margaery | Green | 2017-05-01 |
|    6 | Oberyn   | Red   | 2017-06-01 |
+------+----------+-------+------------+

这是一个dbfiddle演示