聚合依赖于订单的分区?

时间:2013-07-09 07:49:39

标签: sql select aggregate-functions

我有这样的源数据集(简化为更清晰):

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语句实现这样的分区?

谢谢和问候 启。

2 个答案:

答案 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