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

こことグーグルでもよく検索しましたが、見つけた解決策は実際には機能しません。たとえば、提案されたソリューションの 1 つは、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]

しかし、集計関数または group by ステートメントのいずれにもリストされていないフィールドを選択できないことを Oracle から覚えているので、期待どおりの結果が得られるとは限りません。それを解決する方法はありますか?

前もって感謝します。

4

1 に答える 1

1

value_name ごとに一意である場合last_modified、これを使用できます。

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 に答える