如何根据字段日期获取大查询的最新记录

How to get the latest record on big query based on field date

这是我的查询

SELECT producto, ROUND(precio_medio,2) as precio, fecha, mpio, cod_dpto, tipo, presentacion FROM DATABASE where categoria="Arrendamiento de tierras" and tipo="Arrendamiento de tierras" and producto="Cabeza de ganado mensual para pastoreo, terreno inclinado/ondulado con agua" and presentacion ="Arriendo"

它return [id, producto, precio, fecha,mpio,cod_dpto, presentacion]

所以我只想获取 fecha 字段中每个 Popayan 和 Piendamo 的延迟记录

在 Big Query 中,您可以为此使用数组。假设您想要每个 mpio:

最近 fecha 的行
select * except(ar)
from (  
    select 
        mpio,
        array_agg(
            struct(id, producto, precio, mpio,cod_dpto, presentacion)
            order by fecha desc limit 1
        ) ar
    from database
    where 
        categoria="Arrendamiento de tierras" 
        and tipo="Arrendamiento de tierras" 
        and producto="Cabeza de ganado mensual para pastoreo, terreno inclinado/ondulado con agua" 
        and presentacion ="Arriendo"
    group by mpio
) x, unnest(x.ar)

更标准的方法是使用window函数:

select * except(rn)
from (
    select 
        fecha, id, producto, precio, mpio,cod_dpto, presentacion,
        row_number() over(partition by mpio order by fecha desc) rn
    from database
    where 
        categoria="Arrendamiento de tierras" 
        and tipo="Arrendamiento de tierras" 
        and producto="Cabeza de ganado mensual para pastoreo, terreno inclinado/ondulado con agua" 
        and presentacion ="Arriendo"
) t
where rn = 1

更“简单”的版本(对于 BigQuery Standard SQL)

#standardSQL
SELECT 
    mpio,
    ARRAY_AGG(
        STRUCT(id, producto, precio, fecha, cod_dpto, presentacion)
        ORDER BY fecha DESC LIMIT 1
    )[OFFSET(0)].*
FROM `project.dataset.table`  
WHERE categoria="Arrendamiento de tierras" 
  AND tipo="Arrendamiento de tierras" 
  AND producto="Cabeza de ganado mensual para pastoreo, terreno inclinado/ondulado con agua" 
  AND presentacion ="Arriendo"
GROUP BY mpio