【问题标题】:Window Functions窗口函数
【发布时间】:2018-08-01 18:22:19
【问题描述】:

我想添加一个窗口功能。

当访问 = Y 时取 min 日期并以 Associd 结束。

表A

ID    Date      AssocId  Visit
 1     1/1/17    10101     Y
 1     1/2/17    10102     Y

最终结果。

ID    Date    AssocId
 1    1/1/17    10101

SQL > 这给了我最小日期,但我需要关联到该日期的 AssocId。

 SELECT MIN(CASE WHEN A.VISIT = 'Y'
 THEN A.DATE END) OVER (PARTITION BY ID) 
 AS MIN_DT,

【问题讨论】:

  • 为什么要使用窗口函数?如果你只想要一行,那么聚合更有意义。
  • 我正在使用窗口函数来捕获最小日期,但我希望关联到该最小日期。不知道如何捕获

标签: sql oracle window-functions


【解决方案1】:

你可以使用FIRST_VALUE():

 SELECT MIN(CASE WHEN A.VISIT = 'Y' THEN A.DATE END) OVER (PARTITION BY ID)  AS MIN_DT,
        FIRST_VALUE(CASE WHEN A.VISIT = 'Y' THEN A.ASSOCID END) KEEP (DENSE_RANK FIRST OVER (PARTITION BY ID ORDER BY A.VISIT DESC, A.DATE ASC),

请注意,这对于条件操作来说有点棘手。我更倾向于使用子查询来嵌套查询操作。外部表达式是:

SELECT MAX(CASE WHEN Date = MIN_DT THEN ASSOCID END) OVER (PARTITION BY ID)

如果你想要这个ID,我建议:

select id, min(date),
       first_value(associd) over (partition by id order by date)
from t
where visit = 'Y'
group by id;

即使用聚合函数。

【讨论】:

    【解决方案2】:

    你似乎想要:

    select t.*
    from table t
    where visit = 'Y' and
          date= (select min(t1.date) from table t1 where t1.id = t.id);
    

    【讨论】:

      猜你喜欢
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 2018-12-15
      • 2015-10-12
      • 2015-08-28
      • 2016-04-25
      • 2021-09-13
      • 1970-01-01
      相关资源
      最近更新 更多