Window 函数
Window Functions
我想添加一个window功能。
当 visit = 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,
你似乎想要 :
select t.*
from table t
where visit = 'Y' and
date= (select min(t1.date) from table t1 where t1.id = t.id);
您可以使用 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;
即使用聚合函数
我想添加一个window功能。
当 visit = 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,
你似乎想要 :
select t.*
from table t
where visit = 'Y' and
date= (select min(t1.date) from table t1 where t1.id = t.id);
您可以使用 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;
即使用聚合函数