LEFT JOIN by closer value 条件

LEFT JOIN by closer value condition

我有这个问题

SELECT
    loc.proceso,
    loc.codigo_municipio,
    loc.codigo_concejo,
    loc.concejo,
    (CASE
        WHEN loc.poblacion IS NOT NULL THEN loc.poblacion
        ELSE pob.valor
    END) AS poblacion
FROM develop.031401_elecciones_dimension_localizacion_electoral AS loc
LEFT JOIN develop.031401_elecciones_dimension_proceso_electoral AS proc
ON loc.proceso = proc.proceso
LEFT JOIN develop.020101_t05 AS pob
ON loc.codigo_municipio = CAST(pob.cmun AS INT) AND pob.year = proc.anno_eleccion

在第二个LEFT JOIN中,我想更改第二个条件pob.year = proc.anno_eleccion,使其在加入时不只搜索确切的年份。相反,我想将更近的年份存储在我的 pob table 中。例如pob中存储的第一年是2003,所以我希望loc中所有低于2003的条目在执行时都与该值匹配加入。同样反过来,存储在 pob 中的最后一年是 2020,所以我希望 loc 中那些年份是 2021(或什至更大)的条目被匹配使用我的 pob table 中的 2020 行。当 pob table 中包含确切的年份时,应该将其用于连接。

1.如果你想要离现在最近的年份

我不考虑直接联接,但您可以尝试使用 ROW_NUMBER() 函数按年份对数据进行排序并选择第一个结果进行联接: (WHERE rn = 1 选择第一个索引,这样可以防止重复)

LEFT JOIN 
   (SELECT T.* FROM 
(SELECT ROW_NUMBER() OVER (PARTITION BY pob.cmun ORDER BY pob.year DESC) AS rn,
   *
FROM develop.020101_t05) AS T
WHERE rn = 1) AS pob
ON loc.codigo_municipio = CAST(pob.cmun AS INT) AND pob.year = proc.anno_eleccion

2。如果你想要最接近你的数据的年份

即使这不是最佳做法,您也可以在连接条件下使用比较运算符来连接您的数据。然后,取两年之间的差异,对差异进行升序排序,并使用 ROW_NUMBER() 函数选择第一个结果。参见示例:

SELECT * FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY a.Id ORDER BY a.Year - b.Year) AS RowNumber,
       a.Id,
       a.Year,
       b.Year,
       a.Year - b.Year AS YearDiff
FROM a
LEFT JOIN b ON a.Id = b.Id AND a.Year >= b.Year) AS T
WHERE RowNumber = 1