サンプル表:
id computer app version build date
---|---------|------|------------|-------|---------
1 | aaaa1 | app1 | 1.0.0 | 1 | 2013-11-11 09:51:07
2 | aaaa1 | app2 | 2.0.0 | 2 | 2013-11-12 09:51:07
5 | xxxx2 | app1 | 1.0.0 | 1 | 2013-11-13 09:51:07
3 | cccc3 | app2 | 3.1.0 | 1 | 2013-11-14 09:51:07
4 | xxxx2 | app1 | 1.0.0 | 2 | 2013-11-15 09:51:07
5 | cccc3 | app2 | 3.1.1 | 3 | 2013-11-16 09:51:07
6 | xxxx2 | app1 | 1.0.2 | 1 | 2013-11-17 09:51:07
7 | aaaa1 | app1 | 1.0.2 | 3 | 2013-11-18 09:51:07
目的の出力(正確な形式やリスト順ではない)、各コンピューターの各アプリの最新インストールを取得する:
7. aaaa1 - app1 - 1.0.2 - 3 - 2013-11-18 09:51:07
2. aaaa1 - app2 - 2.0.0 - 2 - 2013-11-12 09:51:07
6. xxxx2 - app1 - 1.0.2 - 1 - 2013-11-17 09:51:07
5. cccc3 - app2 - 3.1.1 - 3 - 2013-11-16 09:51:07
私のSQLステートメント:
SELECT
id,
computer,
app,
version,
build,
MAX(date) AS installed
FROM
data
WHERE
placement = 'xxx'
GROUP BY
app, computer
;
これは私に与えます:
1. aaaa1 - app1 - 1.0.0 - 1 - 2013-11-11 09:51:07
ではなく
7. aaaa1 - app1 - 1.0.2 - 3 - 2013-11-18 09:51:07
私の期待通りに。
MAX(date)は、I [〜#〜] only [〜#〜] MAX(date)を選択した場合にのみ機能します。しかし、その後、私は(最新の日付だけで)動作するデータを取得しません。
SELECT
MAX(date) AS installed
私はSQLの忍者ではないので、このためにすぐに頭をかいてはげてしまいます。
このようにしてみてください:
SELECT d.id, d.computer, d.app, d.version, d.build, a.installed
FROM data d
INNER JOIN (
SELECT computer, app, max(DATE) AS installed
FROM data
GROUP BY computer, app
) a ON a.computer = d.computer AND a.app = d.app
WHERE placement = 'xxx'
内部クエリは、コンピューターとアプリの各ペアのmax(date)を取得します。その後、それに参加するだけで、残りの情報を取得できます。
日時フィールドをキャストしてみてください
SELECT
id,
computer,
app,
version,
build,
MAX(cast(date as Datetime)) AS installed
FROM
data
WHERE
placement = 'xxx'
GROUP BY
app, computer, id, version, build
;
どうしたの:
SELECT
id,
computer,
app,
version,
build,
`date` AS installed
FROM
data
WHERE
placement = 'xxx'
ORDER BY installed DESC
GROUP BY app;
日付を文字列として保存し、文字列を比較することは整数を比較することとは異なる動作をするためかもしれません。日付はnix Timestamp formatで保存する必要があり、比較しやすくなります。ただし、通常の英語の日付として表示するには追加の作業が必要になります。
MAXは私には機能しませんでした。機能したのは、日付でテーブルを事前に順序付けした追加のサブクエリでした。
SELECT d.id, d.computer, d.app, d.version, d.build, a.installed
FROM data d
INNER JOIN (
SELECT computer, app, date as installed
FROM (
SELECT computer, app, date
FROM data
ORDER BY date desc
) as t
GROUP BY computer, app
) a ON a.computer = d.computer AND a.app = d.app
WHERE placement = 'xxx'
max-selectステートメントのすべての列をGROUP BY
に追加しようとする集約関数です。
GROUP BY
app, computer, id, version, build.