SQL:检索不在聚合或组语句中的列
我有以下数据SQL:检索不在聚合或组语句中的列,sql,sqlite,group-by,greatest-n-per-group,Sql,Sqlite,Group By,Greatest N Per Group,我有以下数据 -------------------------------------------------------------------------------- id | value_name | last_modified | system_id | value_data | --------------------------------------------------------------------------------
--------------------------------------------------------------------------------
id | value_name | last_modified | system_id | value_data |
--------------------------------------------------------------------------------
1 | name1 | 2012-06-04 | 1 | aaa |
2 | name1 | 2012-02-04 | 1 | bbb |
3 | name1 | 2012-04-25 | 1 | ccc |
4 | name2 | 2012-07-04 | 1 | ddd |
5 | name2 | 2012-06-14 | 1 | eee |
6 | name3 | 2011-09-05 | 1 | qqq |
--------------------------------------------------------------------------------
现在我只需要获取最近修改的值
更新
对于上面的表,我想得到以下结果
--------------------------------------------------------------------------------
id | value_name | last_modified | system_id | value_data |
--------------------------------------------------------------------------------
1 | name1 | 2012-06-04 | 1 | aaa |
4 | name2 | 2012-07-04 | 1 | ddd |
6 | name3 | 2011-09-05 | 1 | qqq |
--------------------------------------------------------------------------------
我在这里搜索了很多,也在谷歌搜索了很多,但我找到的解决方案实际上并不奏效。例如,建议的解决方案之一是usign join
SELECT
v.[id],
v.[system_id],
v.[value_name],
v.[value_data]
FROM
[values] v INNER JOIN
(
SELECT
v.[id],
MAX(v.[last_modified]) AS last_modified
FROM
[values] v
WHERE
v.[system_id] = 1
GROUP BY
v.[id]
) s
ON
v.[id] = s.[id]
但子查询是按id
(唯一)分组的,因此它不会计算最大上次修改日期。
我正在使用SQLite和简单的查询,这对我来说很有用
SELECT
v.[id],
v.[system_id],
v.[value_name],
v.[value_data],
MAX(v.[last_modified]) AS last_modified
FROM
[values] v
WHERE
v.[system_id] = 1
GROUP BY
v.[value_name]
但我从Oracle记得,您不能选择未在聚合函数或group by语句中列出的字段,所以我不确定这是否能保证提供预期的结果。有什么建议可以解决这个问题吗
提前感谢。如果上次修改的
每个值的名称都是唯一的,您可以使用以下方法:
SELECT
v.[id],
v.[system_id],
v.[value_name]
FROM
[values] v INNER JOIN
(
SELECT
v.[value_name],
MAX(v.[last_modified]) AS last_modified
FROM
[values] v
WHERE
v.[system_id] = 1
GROUP BY
v.[value_name]
) s
ON
v.[value_name] = s.[value_name]
AND
v.[last_modified] = s.[last_modified]
如果没有,则需要提取按值\u名称分组的上次\u修改的最后id:
SELECT
v.[id],
v.[system_id],
v.[value_name]
FROM
[values] v INNER JOIN
(
SELECT max(id) ID
FROM [values] v_max
INNER JOIN
(
SELECT
[value_name],
MAX([last_modified]) AS last_modified
FROM
[values]
WHERE
[system_id] = 1
GROUP BY
[value_name]
) s
ON
v_max.[value_name] = s.[value_name]
AND
v_max.[last_modified] = s.[last_modified]
GROUP BY s.value_name, s.last_modified
) maxID
ON v.ID = maxID.ID
免责声明:未测试。如果上次修改的每个值的名称都是唯一的,则可以使用此选项:
SELECT
v.[id],
v.[system_id],
v.[value_name]
FROM
[values] v INNER JOIN
(
SELECT
v.[value_name],
MAX(v.[last_modified]) AS last_modified
FROM
[values] v
WHERE
v.[system_id] = 1
GROUP BY
v.[value_name]
) s
ON
v.[value_name] = s.[value_name]
AND
v.[last_modified] = s.[last_modified]
如果没有,则需要提取按值\u名称分组的上次\u修改的最后id:
SELECT
v.[id],
v.[system_id],
v.[value_name]
FROM
[values] v INNER JOIN
(
SELECT max(id) ID
FROM [values] v_max
INNER JOIN
(
SELECT
[value_name],
MAX([last_modified]) AS last_modified
FROM
[values]
WHERE
[system_id] = 1
GROUP BY
[value_name]
) s
ON
v_max.[value_name] = s.[value_name]
AND
v_max.[last_modified] = s.[last_modified]
GROUP BY s.value_name, s.last_modified
) maxID
ON v.ID = maxID.ID
免责声明:未测试。最新值是什么意思?最新修改日期的平均值。更新了问题。您不应该使用value\u name
而不是ID吗?Id是唯一的,因为它是…没有得到你的问题。什么意思?我应该在哪里使用value\u name而不是id?在组员中?我还不明白你的问题。你想要多少上次修改的值?最新值是什么意思?我指的是最大上次修改日期的值。更新了问题。您不应该使用value\u name
而不是ID吗?Id是唯一的,因为它是…没有得到你的问题。什么意思?我应该在哪里使用value\u name而不是id?在分组中?我还不明白你的问题。你想要多少最后修改的值?@axe:我已经编辑了我的答案。如果您正在测试它,请再试一次。据我所知,不是在sqlite中。实现窗口函数的数据库可以大大简化此类查询。上次修改的不是唯一的。第二个查询可能会工作,但是您还需要将WHERE[system\u id]=1过滤条件添加到SELECT max(id)子查询中。问题是在现实生活中并不是那么简单,大约有5个这样的过滤器,最后的修改日期存储在其他链接表中。如果我采取这种方法,这个select语句将非常庞大。是否有任何较短的解决方案?我甚至无法在此处创建视图以减少查询大小..:(是的。在您回答并删除我的评论之前就得到了它。谢谢。@axe:我已经编辑了我的答案。如果您正在测试它,请再试一次。据我所知,不是在sqlite中。实现窗口功能的数据库可以大大简化此类查询。上次修改不是唯一的。第二次查询可能会工作,但您需要添加WHERE。)[system_id]=1个筛选条件以选择最大值(id)子查询也是如此。问题是在现实生活中它并不是那么简单,大约有5个这样的过滤器,最后的修改日期存储在其他链接表中。如果我采用这种方法,这个select语句将非常庞大。是否有任何较短的解决方案?为了减小查询大小,我甚至不能在此处创建视图..:(是的。在你回复并删除我的评论之前,我已经收到了。谢谢。