2015-12-08 21 views
5

Tôi có một bảng có nhiều mục trùng lặp - Nhiều hàng có cùng một số id, có lẽ chỉ có một cột khác là cột requested_at.Chỉ trả lại các hàng mới nhất từ ​​một bảng BigQuery với một mục trùng lặp

Tôi muốn thực hiện một số select * từ bảng, nhưng chỉ trả lại một hàng với cùng một số id - yêu cầu mới nhất.

Tôi đã xem xét group by id nhưng sau đó tôi cần thực hiện tổng hợp cho từng cột. Điều này rất dễ dàng với requested_at - max(requested_at) as requested_at - nhưng những người khác thì khó khăn.

Làm cách nào để đảm bảo tôi nhận được giá trị cho title, v.v ... tương ứng với hàng được cập nhật gần đây nhất?

Trả lời

7

Tôi đề nghị một hình thức tương tự mà tránh được một loại trong hàm cửa sổ:

SELECT * 
    FROM (
     SELECT 
      *, 
      MAX(<timestamp_column>) 
       OVER (PARTITION BY <id_column>) 
       AS max_timestamp, 
     FROM <table> 
    ) 
    WHERE <timestamp_column> = max_timestamp 
2

Hãy thử một cái gì đó như thế này:

SELECT * 
    FROM (
     SELECT 
      *, 
      ROW_NUMBER() 
       OVER (
        PARTITION BY <id_column> 
        ORDER BY <timestamp column> DESC) 
       row_number, 
     FROM <table> 
    ) 
    WHERE row_number = 1 

Lưu ý nó sẽ thêm một cột row_number, mà bạn có thể không muốn. Để khắc phục điều này, bạn có thể chọn từng cột theo tên trong câu lệnh chọn bên ngoài.

Trong trường hợp của bạn, có vẻ như cột requested_at là cột bạn muốn sử dụng trong ORDER BY.

Và, bạn cũng sẽ muốn sử dụng allow_large_results, đặt bảng đích và chỉ định không làm phẳng kết quả (nếu bạn có lược đồ có các trường lặp lại).

Các vấn đề liên quan