1

我有以下数据。

--------------------------------------------------------------------------------
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           |
--------------------------------------------------------------------------------

我在这里和谷歌搜索了很多,但我能找到的解决方案实际上并不起作用。例如,建议的解决方案之一是使用连接。

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 语句中列出的字段,所以我不确定这是否能保证给我预期的结果。任何建议如何解决?

提前致谢。

4

1 回答 1

1

如果last_modified每个 value_name 是唯一的,则可以使用:

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]

如果没有,您将需要提取按 value_name 分组的 last_modified 的最后一个 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

免责声明:未经测试。

于 2012-07-18T08:07:29.763 回答