【问题标题】:Flattening mutliple Rows into a single row based on identifier根据标识符将多行展平为单行
【发布时间】:2018-10-26 14:28:43
【问题描述】:

我正在尝试获取一个结果集(并最终创建一个视图),它将基于标识符组合行。以下是我所拥有的以及我正在努力实现的示例:

现有数据

/* +----+------+---------+------+------ -+--------------------+ */ /* |身份证 |图形用户界面 |姓名 |年龄 |地址 | Entry_Create_Date | */ /* +----+------+---------+------+------ -+--------------------+ */ /* | 1 | 123 |鲍勃 | 42 |空 | 2018 年 1 月 2 日 | */ /* | 1 | 245 |鲍勃 | 41 |松饼巷 123 号 | 2018 年 1 月 1 日 | */ /* | 1 | 356 |鲍勃 |空 |空 | 2018 年 1 月 3 日 | */ /* | 2 |第456章查尔斯 | 21 | 235 谢伯特巷 | 2018 年 1 月 3 日 | */ /* +----+------+---------+------+------ -+--------------------+ */

期望的输出:

/* +----+----------+-----+-------------------+ */ /* |身份证 |姓名 |年龄 |地址 | */ /* +----+----------+-----+-------------------+ */ /* | 1 |鲍勃 | 42 |松饼巷 123 号 | */ /* | 2 |查尔斯 | 21 | 235 谢伯特巷 | */ /* +----+----------+-----+-------------------+ */

结果使用 Entry_Create_Date 来确定最新记录。一旦找到该行,它就会将其用作基础。如果值为 NULL,则它使用具有相同 ID 值的其他行的值来从中获取值。列值的优先级由其创建日期决定。

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    这很复杂。您似乎想要每个字段的最新值。怎么样 。 . .

    select distinct id, name,
           first_value(age) over (partition by id order by case when age is not null then 1 else 2 end, Entry_Create_Date desc) as age,
           first_value(Address) over (partition by id order by case when Address is not null then 1 else 2 end, Entry_Create_Date desc) as Address
    from t;
    

    【讨论】:

    • 这很棒。我以前从未听说过FIRST_VALUE。每天学习新东西!
    • 这很有趣。我以前没见过这个。我会尝试一下,让你知道它是如何工作的:)
    • 两年后我在这里的回复。这绝对对我们有用,并且在我们的设计中起着至关重要的作用。我会警告任何未来的读者,如果您查询的数据子集很大,使用此方法可能会影响性能。所以在使用时请记住这一点。
    【解决方案2】:

    您的示例数据建议我进行聚合 (NOT EXACTLY):

    SELECT id, Name, MAX(Age), MAX(Address)
    FROM table t
    WHERE Age IS NOT NULL OR Address IS NOT NULL
    GROUP BY id, Name;
    

    【讨论】:

      猜你喜欢
      • 2017-10-08
      • 1970-01-01
      • 2022-09-22
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      相关资源
      最近更新 更多