sql - 按组内每 N 行分组
问题描述
我需要对每组 SQL 表中的每 N 行进行分组,我找到的最佳答案是这个;https://stackoverflow.com/a/66806186/10916933但我的数据也按另一个标识符(批处理)分组,我想在每次标识符更改时启动一个新的 GroupID。批次大小不一致。
这是我目前得到的(出于显示目的,N = 2,实际上是 1000):
批 | 价值 | 行号 | 组ID |
---|---|---|---|
一个 | 10.2 | 1 | 1 |
一个 | 6.7 | 2 | 1 |
一个 | 7.6 | 3 | 2 |
乙 | 7.0 | 4 | 2 |
乙 | 10.2 | 5 | 3 |
C | 9.6 | 6 | 3 |
C | 8.2 | 7 | 4 |
C | 1.1 | 8 | 4 |
C | 0.3 | 9 | 5 |
C | 9.0 | 10 | 5 |
C | 10.2 | 11 | 6 |
这就是我想要的(即当 Batch B 开始时,它给了我一个新的 GroupID,即使只有一个):
批 | 价值 | 行号 | 组ID |
---|---|---|---|
一个 | 10.2 | 1 | 1 |
一个 | 6.7 | 2 | 1 |
一个 | 7.6 | 3 | 2 |
乙 | 7.0 | 4 | 3 |
乙 | 10.2 | 5 | 3 |
C | 9.6 | 6 | 4 |
C | 8.2 | 7 | 4 |
C | 1.1 | 8 | 5 |
C | 0.3 | 9 | 5 |
C | 9.0 | 10 | 6 |
C | 10.2 | 11 | 6 |
解决方案
嗯。. . 您可以指示组开始使用的位置lag()
和行号算术。然后做一个累积和。一个新组从每批的奇数行开始:
select t.*,
sum(is_start) over (order by batch, rowid) as groupid
from (select t.*,
(case when row_number() over (partition by batch order by rowid) % 2 = 1
then 1 else 0
end) as is_start
from t
) t
推荐阅读
- python - 在 tkinter 的弹出窗口中动态创建条目小部件时出现问题
- ruby-on-rails - rufus-scheduler 只用 puma 执行一次 rake 任务
- mysql - SQL 使用 csv 源路径创建表
- c++ - JsonCpp:如何将 unordered_map 转换为 Json::Value
- windows - 是否存在与 SID 1:1 映射的可读 Windows 用户帐户 ID?
- vue.js - Vuex - this.$store.commit 还是 state.commit?
- git - 您使用什么工具或技术来跨存储库同步配置?
- amazon-web-services - 如何将 api 网关(带有 api 密钥)添加到现有的 lambda cloudformation 模板?
- ios - cellForRowAtIndexPath 为不可见的单元格返回 nil
- ios - 在 XCode 11 中使用 FreeForm 作为模拟大小时,无法使 UIView 适合 UIViewController 的完整大小