たとえば、フィールドがアカウント、値、および時間であるテーブルを持つことは一般的です。各アカウントの最後の値を取得するための最適な設計パターンは何ですか? 残念ながら、グループ化の最後のキーワードは、ソートによる最後のレコードではなく、データベースの最後の物理レコードを提供します。つまり、私見では決して使用しないでください。私が使用する 2 つの不器用なアプローチは、サブクエリ アプローチまたはセカンダリ クエリのいずれかで、最後のレコードを特定し、テーブルに結合して値を見つけます。もっとエレガントなアプローチはありませんか?
8 に答える
これは、テーブルの最後のレコードを返すための良いトリックです。
SELECT TOP 1 * FROM TableName ORDER BY Time DESC
詳細については、このサイトをチェックしてください。
サブクエリ オプションは、次の puedo-sql のようなもので、私には最適に思えます。結合を介して最適化することが可能/必要になる場合がありますが、これは SQL エンジンの機能によって異なります。
select *
from table
where account+time in (select account+max(time)
from table
group by account
order by time)
あなたはできませんでした:
select account,last(value),max(time)
from table
group by account
私はこれをテストしました (非常に小さく、ほとんど自明なレコード セットで許可されています)。適切な結果が得られました。
編集:
これも、さらにテストした後は機能しません。私は過去の人生でかなりのアクセスプログラミングを行いました.1つのクエリであなたが求めていることを行う方法があるように感じますが、現時点では空白を描いています. ごめん。
@Tom一般的に、あなたが提案した「In」クエリを実行する方が簡単かもしれません。一般的に私は次のようなことをします
select T1.account, T1.value
from table T as T1
where T1 = (select max(T2.time) from table T as T2 where T1.account = T2.Account)
文字通り何年も検索した後、#3 の下のリンクで答えを見つけました。上記のサブクエリは機能しますが、非常に遅く、私の目的では衰弱するほど遅くなります。
より一般的な答えは、3 レベルのクエリです。第 1 レベルは最大値を見つけ、第 2 レベルは第 1 クエリに基づいてフィールド値を取得します。結果はテーブルとしてメイン クエリに結合されます。高速だが複雑で、コーディング/メンテナンスに時間がかかる。
このリンクは機能し、それでもかなり高速に実行され、コーディング/保守の作業が大幅に削減されます。このサイトの作成者に感謝します。
Access 2003 クエリ ビルダを使用してグループ内の最新の日付を検索しようとしていますが、日付フィールドに LAST を使用しようとして同じ問題に遭遇しました。しかし、MAX を使用すると遅い日付が検出されるようです。
@shs
はい、last(value)を選択する必要がありますが、機能しません...信頼できるソースを作成することはできませんが、last(value)はアクセスファイルの最後の物理レコードを提供するということです。これは、時間的には最初のものである可能性があるが、物理的には最後のものである可能性があることを意味します。したがって、本当に悪いランダム行以外には last(value) を使用するべきではないと思います。
次の SQL は不格好かもしれませんが、Access では正しく動作するようです。
SELECT
a.account,
a.time,
a.value
FROM
tablename AS a INNER JOIN [
SELECT
account,
Max(time) AS MaxOftime
FROM
tablename
GROUP BY
account
]. AS b
ON
(a.time = b.MaxOftime)
AND (a.account = b.account)
;