我有一个VIEW,其中包含来自多个表的大量信息。在此VIEW中执行查询时,我需要通过列的值对结果进行分组。
我的主要问题是,当对结果进行分组时,我不需要按顺序进行分组。我注意到,在分组时,我的数据库最终得到它在指定列中找到的第一个不同记录,并忽略其余记录。
问题是,我需要包含分组词的最后一行。我已经尝试在进行分组之前进行排序,但即便如此,我的数据库引擎似乎也忽略了之前完成的排序。
使用下表作为我的观点的示例,这是我的问题:
我怎么知道哪个是角色注册每种颜色的最后日期?
也就是说,我需要所有的表列ORDER by DATE DESC和GROUP by COLOR。
+------+------------+-------+------------+ | 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 | +------+----------+-------+------------+
答案 0 :(得分:0)
如果我正确理解你想要做什么,你可以尝试
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演示