如何在 SQL Server 中选择具有 in 条件的查询的第一条记录?

问题描述 投票:0回答:1

我有一张包含如下信息的表格:

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”的最后一条记录。我怎样才能有效地实现这一目标?

sql sql-server database relational-database
1个回答
0
投票

要检索每个“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;

在此查询中:

  1. ROW_NUMBER
    窗口函数用于根据
    FECHA
    列按降序(
    ORDER BY FECHA DESC
    )为每个“BORDER_CODE”组内的每一行分配行号。这将为每个“BORDER_CODE”创建一个记录的排名列表。

  2. PARTITION BY
    函数中的
    ROW_NUMBER
    子句确保对每个“BORDER_CODE”单独进行排名。

  3. CTE

    RankedRecords
    包含排名记录。

  4. 在最后的

    SELECT
    语句中,您可以为每个“BORDER_CODE”过滤行号等于1的记录,这代表每个组的最后一条记录。

此查询根据指定条件高效检索每个“BORDER_CODE”的最后一条记录。

© www.soinside.com 2019 - 2024. All rights reserved.