2016-09-03 10 views
0

안녕하세요 다음 구조의 테이블이 있습니다.Web2py DAL이 (가) 최신 날짜가 기록을 찾는다

테이블 이름 : 서류

예제 테이블 구조 :

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를 가져 싶다.

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 저를 가져옵니다 :

는 작동 PostgreSQL의 쿼리입니다.

이 값을 얻으려면 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 조합에 대해 마지막으로 수정 된 레코드를 가져 오는 단일 쿼리를 원하거나 각 조합에 대해 별도의 쿼리를 실행 하시겠습니까? 원하는 정확한 결과에 대한 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' 오브젝트로 변환하고 가장 최근의 것을 선택하기 때문에 (파이썬 메소드 인'.first'를 통해 SQL 쿼리에 영향을주지 않기 때문에) 다소 비효율적입니다. 효율성을 높이려면'.select()'호출에'limitby = (0, 1)'을 추가하십시오. 그러면 첫 번째 (즉 최근 레코드) 레코드 만 데이터베이스에 의해 반환됩니다. 레코드가 반환 될 때'Rows' 객체에서 추출하기 위해서는'.first'가 필요합니다). – Anthony

+0

수정하십시오. Anthony에게 감사드립니다! 그에 따라 변경되었습니다. –