2016-09-03 20 views
0

こんにちは私は以下の構造のテーブルを持っています。Web2py DAL最新の日付のレコードを見つける

表名:DOCUMENTS

サンプルテーブルの構造:

ID | UIN  | COMPANY_ID | DOCUMENT_NAME | MODIFIED_ON   | 
---|----------|------------|---------------|---------------------| 
1 | UIN_TX_1 | 1   | txn_summary | 2016-09-02 16:02:42 | 
2 | UIN_TX_2 | 1   | txn_summary | 2016-09-02 16:16:56 | 
3 | UIN_AD_3 | 2   | some other doc| 2016-09-02 17:15:43 | 

私はIDが1とDOCUMENT_NAME "txn_summary" である同社の最新の変更されたレコードのUINを取得したいです。

これは動作しますPostgreSQLのクエリです:

select distinct on (company_id) 
     uin 
from documents 
where comapny_id = 1 
and document_name = 'txn_summary' 
order by company_id, "modified_on" DESC; 

このクエリは私に正しいUIN_TX_2をフェッチします。

私はweb2py DALを使用してこの値を取得しています。いくつかの研究の後、私はこれを行うには成功している:

fmax = db.documents.modified_on.max() 
query = (db.documents.company_id==1) & (db.documents.document_name=='txn_summary') 

rows = db(query).select(fmax) 

「行」は最大値を有するmodified_on日付の値のみが含まれています。私は "行"内に最大の日付を持つレコードを取得したい。方法を提案してください。ヘルプは非常に感謝しています。

私の要件は、各document_nameの各company_idごとにそのようなレコードを見つけるために拡張されています。

+0

各company_id/document_nameの組み合わせに対して最後に変更されたレコードを取得する1つのクエリが必要な場合、または各組み合わせに対して個別のクエリを実行する場合は、あなたはあなたが望む正確な結果のSQL式を表示できますか? – Anthony

+0

こんにちは@Anthony、後悔して申し訳ありません。はい、各company_id/document_nameの組み合わせに対して最後に変更されたレコードが必要です。私は個々の(company_id/document_name)の組み合わせのリストでforループを実行することを望んでいました。 –

答えて

0

あなたのアプローチは完全な行を返しません、最後のmodified_on値だけを返します。

は、クエリがmodified_onの降順に配置されたレコードが返され

query = (db.documents.company_id==1) & (db.documents.document_name=='txn_summary') 
row = db(query).select(db.documents.ALL, orderby=~db.documents.modified_on, limitby=(0, 1)).first() 

orderby=~db.documents.modified_onになり、最後のフェッチIDが1及びDOCUMENT_NAME「txn_summary」会社のレコードを修飾する(最後のレコードが最初であろう改変) first()は最初のレコードを選択します。すなわち、完全な照会は、会社1および文書名=「txn_summary」を有する最後に変更されたレコードを返す。

これを達成する他の方法があります。お役に立てれば!

+0

このアプローチは、すべての一致するレコードを選択して 'Row'オブジェクトに変換し、最も最近のものを選択するだけで(PythonメソッドでありSQLクエリに影響を与えない' .first'によって)非効率です。効率性を向上させるために、 '.select()'呼び出しに 'limitby =(0、1)'を追加すると、最初の(つまり最新の)レコードだけがデータベースによって返されますレコードが返されますが、 'Rows'オブジェクトから' .first'を引き出す必要があります)。 – Anthony

+0

正しい。ありがとうアンソニー!それに応じて変更されました。 –

関連する問題