我们的"store"表如下所示:

store_id city_id store_type
1 1 regular
2 1 regular
3 1 regular
50 1 regular
51 1 express
55 1 express
58 1 express
70 1 express
71 2 regular
75 2 regular
78 2 regular
80 2 regular
85 2 regular
90 2 regular
91 1 regular
95 1 regular
97 1 regular
100 1 regular
105 1 regular

我想在SQL Server中创建一个在两列上具有相同值的列表,以便在我们的表存储中进行如下所示的 Select :

min_store_id max_store_id city_id store_type
1 50 1 regular
51 70 1 express
71 90 2 regular
91 105 1 regular

然而,问题是,我们有一个糟糕的store_id系统,因此表中会发生最后一行和第一行的值相同的情况,遗憾的是,我们无法更改它.

试着做了这样的事情:

SELECT MIN(store_id) OVER (PARTITION BY city_id, store_type) AS min_store_id,
       MAX(store_id) OVER (PARTITION BY city_id, store_type) AS max_store_id,
       city_id,
       store_type
FROM store;

但它根本不起作用.

推荐答案

这里有一个缺口和孤岛问题,您可以使用两个ROW_NUMBERS方法之间的差异来创建组:

with cte as (
  select *, row_number() over (order by store_id) 
          - row_number() over (partition by city_id, store_type order by store_id) as grp
  from store
)
SELECT MIN(store_id) AS min_store_id,
       MAX(store_id) AS max_store_id,
       max(city_id) as city_id,
       max(store_type) as store_type
FROM cte
group by grp

结果:

min_store_id    max_store_id    city_id store_type
1               50              1       regular
51              70              1       express
71              90              2       regular
91              105             1       regular

Demo here

Sql相关问答推荐

用相同值更新行

按每天的最大值分组

Access中执行INSERT INTO查询时出现错误消息

使用SQL创建列出两个时间戳之间小时数的列

用于过滤嵌套对象或数组中的JSON数据的WHERE条件

如何根据行状态设置正确的标志

如何找到一个组合的两个列,这是不是在其他表在ORACLE SQL?

如何使用jsonn_populate_record()插入到包含IDENTITY列的表中

如何使用 join 和 where 子句从另一表中仅删除一个表中的值

在where语句中使用CTE非常缓慢

达到特定值时,从0开始累加求和

SQL中如何转置表格 UNPIVOT是唯一的 Select 吗?

Postgresql 需要一个查询,为我提供所有没有具有特定状态值的子元素的父母

将有效数字作为 varchar 返回的 SQL 函数

过滤具有一对多关系的两个表之间的数据

如果 SQL 中不存在数据,如何根据某个 ID 为所有日期添加前一行

根据条件列出不同的值

并非所有变量都绑定在 PL SQL 函数中

为什么 Oracle 在一个查询中对同一张表同时执行 TABLE SCAN 和 INDEX UNIQUE SCAN?

按 15 分钟递增计数分组,包括 0 计数