Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:检索不在聚合或组语句中的列_Sql_Sqlite_Group By_Greatest N Per Group - Fatal编程技术网

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语句将非常庞大。是否有任何较短的解决方案?为了减小查询大小,我甚至不能在此处创建视图..:(是的。在你回复并删除我的评论之前,我已经收到了。谢谢。