我有这样的源数据集(简化为更清晰):
Key F1 F2
1 X 4
2 X 5
3 Y 6
4 X 9
5 X 7
6 X 8
7 Y 9
8 X 6
9 X 5
10 Y 3
数据按Key字段排序。现在,我想在F1字段定义的分区上计算F2字段的聚合:分区从第一个X值开始,以第一个后续Y值结束。
因此,例如,我可能想要在如上所述定义的分区上计算MIN()。然后结果集看起来像这样:
rownum MIN(F2)
1 4
2 7
3 3
我已经尝试了许多资源(包括我们自己的Intranet社区,当然还有stackoverflow),但我没有找到任何资源。通常,分区仅适用于可用于标识分区的字段。这里,分区是由字段内容相对于给定顺序的变化来定义的。
虽然我知道我可能不得不求助于编写程序解决方案,但我宁愿在纯SQL中解决这个问题。
如何使用SQL select语句实现这样的分区?
谢谢和问候 启。
答案 0 :(得分:1)
稍微简短的解决方案:http://sqlfiddle.com/#!12/7390d/24
<强>查询:强>
select min(f2)
from t t1
group by (select max(key)
from t t2
where t2.f1='Y' and
t1.key > t2.key)
<强>结果:强>
| MIN |
-------
| 4 |
| 7 |
| 3 |
我们的想法是找到每行和每组前面'Y'的关键字。应该适用于任何SQL引擎。
答案 1 :(得分:0)
您没有指定引擎或方言或版本,所以我假设SQL Server 2012。
您可以运行以查看解决方案的示例:http://sqlfiddle.com/#!6/f5d38/21
您可以通过在集合中创建正确的分区来解决此问题。代码看起来像这样。
WITH groupLimits as
(
SELECT
[Key] AS groupend
,COALESCE(LAG([Key]) OVER (order by [Key]),0)+1 AS groupstart
FROM sourceData
WHERE F1 = 'Y'
)
SELECT
MIN(sourceData.F2)
FROM groupLimits
INNER JOIN sourceData
ON sourceData.[Key] BETWEEN groupLimits.groupstart and groupLimits.groupend
GROUP BY groupLimits.groupstart
ORDER BY groupLimits.groupstart