【问题标题】:How to return values only for the first row in a group如何仅返回组中第一行的值
【发布时间】:2018-02-26 12:11:11
【问题描述】:

我有以下示例数据

MasterRecordId, MasterRecordDate, TargetDate, MasterRecordIdCount
1              | 15/02/2017      |02/02/2017  | 3
1              | 15/02/2017      |05/08/2017  | 3
1              | 15/02/2017      |12/12/2017  | 3
2              | 12/05/2017      |07/08/2017  | 2
2              | 12/05/2017      |10/08/2017  | 2

当我进行选择查询时,我希望输出如下所示

MasterRecordId, MasterRecordDate, TargetDate, MasterRecordIdCount
1              | 15/02/2017      |02/02/2017  | 3
1              |                 |05/08/2017  | 
1              |                 |12/12/2017  | 
2              |                 |07/08/2017  | 2
2              | 12/05/2017      |10/08/2017  | 

基本上,MasterRecordDateMasterRecordIdCountMasterRecordId1 将始终相同,所以我不想重复。

【问题讨论】:

  • "12/05/2017" 的 MasterRecordId = 2 应该是第一条记录
  • 您确定要这样做吗?无论如何它都会返回空值的列
  • 这可以用LAG完成,但正如其他人所说:不要在SQL中这样做;在您的应用或网页中执行此操作。

标签: sql tsql sql-server-2014


【解决方案1】:

这是您应该在应用层进行的转换类型。为什么?因为您的版本中的结果集完全取决于结果的顺序。

可以在 SQL 中执行此操作,但您需要确保最终排序:

select MasterRecordId,
       (case when seqnum = 1 then MasterRecordDate end) as MasterRecordDate,
       TargetDate,
       (case when seqnum = 1 then MasterRecordIdCount end) as MasterRecordIdCount
from (select t.*,
             row_number() over (partition by MasterRecordId order by TargetDate) as seqnum
      from t
     ) t
order by MasterRecordId, TargetDate;

两个非常重要的点。

(1) 外部查询需要order by 以确保结果集的排序正确。 SQL 不保证结果集的顺序,除非您明确指定 order by

(2) 您可能想消除子查询并使用row_number() 两次。这确实适用于您提供的数据。但是,如果两个日期相同,您将面临两个 row_numbers() 在不同行上返回“1”的风险。

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT MasterRecordId,
           ISNULL((CASE WHEN RN = 1 then MasterRecordDate END),'') AS MasterRecordDate,
           TargetDate,
           ISNULL((CASE WHEN RN = 1 then MasterRecordIdCount END),'') AS MasterRecordIdCount
    FROM(
        SELECT MasterRecordId, MasterRecordDate, TargetDate, MasterRecordIdCount
            ,ROW_NUMBER() OVER(PARTITION BY MasterRecordId ORDER BY TargetDate)RN
        FROM Your_Table
        )D
    ORDER BY MasterRecordId, TargetDate
    

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 2017-07-09
      • 2017-12-14
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多