我有一张包含如下信息的表格:
COD_FICHERO,FECHA,ID_VERSION,CODIGO_FRONTERA,FACTOR_PERDIDAS
TFROC,2023-10-23 00:00:00.000,2,Frt5125,1.32993586654688
TFROC,2023-10-04 00:00:00.000,2,Frt0054,1.1361400284643
TFROC,2023-10-09 00:00:00.000,2,Frt4917,1.13871246571916
TFROC,2023-10-03 00:00:00.000,2,Frt2604,1.44391785864422
TFROC,2023-10-27 00:00:00.000,2,Frt2007,1.21119103377573
我感兴趣的列是 CODIGO_FRONTERA 和 FACTOR_PERDIDAS。 对于相同的 BORDER_CODE 有几条记录,因为有很多日期,但我只对最后一个日期感兴趣。 然后,我天真地认为这可以解决我的问题:
SELECT TOP(1) CODIGO_FRONTERA, FACTOR_PERDIDAS
FROM analiticaitsqldw.app.tyd_bdmen_tfroc tba
WHERE CODIGO_FRONTERA IN ('FRT49161',
'Frt00270',
'Frt00338',
'Frt45847',
'Frt46655')
AND ID_VERSION = '2'
ORDER BY FECHA DESC;
但很明显,我只带来了一条记录,而不是每个“BORDER_CODE”的最后一条记录。我怎样才能有效地实现这一目标?
要检索每个“BORDER_CODE”的最后一条记录,您可以使用公共表表达式 (CTE) 和
ROW_NUMBER
窗口函数,根据每个“BORDER_CODE”的 FECHA
列按降序对行进行排名。然后,您可以筛选结果以选择每个“BORDER_CODE”的行号为 1 的记录。下面是有效实现此目的的 SQL 查询:
WITH RankedRecords AS (
SELECT
CODIGO_FRONTERA,
FACTOR_PERDIDAS,
ROW_NUMBER() OVER (PARTITION BY CODIGO_FRONTERA ORDER BY FECHA DESC) AS rn
FROM analiticaitsqldw.app.tyd_bdmen_tfroc tba
WHERE CODIGO_FRONTERA IN ('FRT49161', 'Frt00270', 'Frt00338', 'Frt45847', 'Frt46655')
AND ID_VERSION = '2'
)
SELECT CODIGO_FRONTERA, FACTOR_PERDIDAS
FROM RankedRecords
WHERE rn = 1;
在此查询中:
ROW_NUMBER
窗口函数用于根据FECHA
列按降序(ORDER BY FECHA DESC
)为每个“BORDER_CODE”组内的每一行分配行号。这将为每个“BORDER_CODE”创建一个记录的排名列表。
PARTITION BY
函数中的ROW_NUMBER
子句确保对每个“BORDER_CODE”单独进行排名。
CTE
RankedRecords
包含排名记录。
在最后的
SELECT
语句中,您可以为每个“BORDER_CODE”过滤行号等于1的记录,这代表每个组的最后一条记录。
此查询根据指定条件高效检索每个“BORDER_CODE”的最后一条记录。