【问题标题】:OVER clause for VARCHARVARCHAR 的 OVER 子句
【发布时间】:2022-01-23 03:53:39
【问题描述】:

我可以使用聚合函数对数字和日期列使用 over 子句。但是,我无法对 varchar 列使用 over 子句。在下面的示例中,我可以使用以下行重现 FIRST_FILL_DT 列:

MIN(FILL_DATE) OVER(PARTITION BY ID) AS FIRST_FILL_DT

但是,当尝试生成 FIRST_BP_MED 列时,我不确定是否可以使用类似的语法,因为我不知道聚合函数是否可以正确使用 VARCHAR 列。

任何人都可以就如何解决这个问题提供见解或指导吗?

我的数据是这样的:

我想要的数据应该是这样的:

【问题讨论】:

  • 提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上述#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。全部在问题内,没有图片。
  • 桌子的PK是多少?

标签: sql netezza


【解决方案1】:

这很简单。在窗口子句上使用“FIRST_VALUE”来选择分区忽略的第一个值,而不管条件如何。

https://docs.microsoft.com/en-us/sql/t-sql/functions/first-value-transact-sql?view=sql-server-ver15

SELECT 
    ID, FILL_DATE, BP_MED, 
    MIN (FILL_DATE) OVER (PARTITION BY ID ORDER BY FILL_DATE) AS FIRST_FILL_DT, 
    FIRST_VALUE (BP_MED) OVER (PARTITION BY ID ORDER BY FILL_DATE) AS FIRST_BP_MED
FROM 
    YOURTABLE;

【讨论】:

    【解决方案2】:

    如果你的数据库支持 FIRST_VALUE 窗口函数,你可以使用这样的东西:

    FIRST_VALUE(BP_MED) OVER (PARTITION BY ID ORDER BY FILL_DATE) AS first_bp_med
    

    FIRST_VALUE 的文档:

    MySQL, SQL Server, Postgresql, SQLite

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-08
      • 2014-04-04
      • 2015-10-27
      • 2012-12-19
      • 1970-01-01
      • 2018-03-06
      • 2017-12-27
      • 1970-01-01
      相关资源
      最近更新 更多