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
我有这个问题
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