如何按特定顺序对结果进行分组?
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演示
我有一个 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演示