2012-08-01 3 views
1

가 그래서 나는 테이블과 같은 디자인했다 : 단일 테이블 버전 controled 데이터

create_table "entries", :force => true do |t| 
    t.integer "id", :null => false, :autoincrement => true 
    t.text  "text" 
    t.string "uuid" 
    t.datetime "created_at", :null => false 
end 

나는 비슷한 문제가있는 " Database - data versioning in single table"를 제외하고 나는 여러 소스를 (오프라인으로 작업을 할 일부)이로 쓰고 있다고 데이터베이스, 그래서 current 비트 정말 나를 위해 잘 작동하지 않습니다.

각 UUID를 가장 최근에 얻는 가장 좋은 방법은 무엇입니까?

sqlite : SELECT "entries".* FROM "entries" GROUP BY uuid ORDER BY updated_at DESC에서 작동하지만 위의 postgres 구문이 유효하지 않으므로 janky라고 느껴집니다. 이 작업을 수행하는 좋은 방법이 있습니까? 아니면 스키마를 다시해야합니까?

답변

1

결과를 얻는 한 가지 방법은 window function과 파생 테이블을 사용하는 것입니다. 액티브는 그 중 하나를 이해하지만, 항상 거기 find_by_sql입니다하지 않습니다

Entry.find_by_sql(%q{ 
    select id, text, uuid, created_at 
    from (
     select id, text, uuid, created_at, 
       row_number() over (partition by uuid order by created_at desc) as r 
     from entries 
    ) as dt 
    where r = 1 
}) 

흥미로운 부분은 이것이다 :

row_number() over (partition by uuid order by created_at desc) 

partition by uuidgroup by uuid과 유사하지만 행, 그것은 단지 수정 축소하지 않습니다 row_number() 윈도우 함수가 어떻게 동작하여 row_number()uuid과 일치하는 행에 대해 계산됩니다. order by created_at descrow_number()이 보게 될 창에만 유사하게 적용됩니다. 결과적으로 r = 1은 각 그룹의 첫 번째 행을 벗겨냅니다.

관련 문제