0

我有一个像这样的源数据集(简化为更清楚):

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

感谢和问候凯。

4

2 回答 2

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 引擎。

于 2013-07-09T09:28:01.837 回答
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
于 2013-07-09T09:03:31.453 回答