oracle 分组不连续写法

老板们,某个字段不连续会写,分组的这种咋写都不行,有老板给出个招呗
类别 流水号
类别 流水号
JISa 1
JISa 3
JISa 5
JISa 6
JISb 1
JISb 2
JISb 7
JISb 8
JISc 1
JISc 2
JISd 1
想输出
类别 流水号
JISa 1
JISa 3
JISb 2

要在Oracle数据库中实现类似的分组操作,你可以使用分析函数 LAG 来比较当前行和上一行的值,从而判断是否需要输出。以下是一个示例查询:

SELECT 类别, 流水号
FROM (
    SELECT 类别, 流水号,
           LAG(流水号) OVER (PARTITION BY 类别 ORDER BY 流水号) AS 前一个流水号
    FROM your_table
)
WHERE 流水号 = 1 OR 流水号 - 前一个流水号 = 1;

在这个查询中,子查询使用了分析函数 LAG,它会在当前行中获取上一行的值。根据当前行的流水号和上一行的流水号,我们可以判断是否需要输出。

如果当前行的流水号是1,那么它是一个新的分组的开头,需要输出。
如果当前行的流水号与上一行的流水号差值为1,说明当前行是连续的,也需要输出。
将 your_table 替换为你的实际数据表名。

执行这个查询后,你会得到需要的输出,其中每个分组的第一个记录和连续的记录都会被包含在结果中。

像这种类别只有一条数据的话不判断是否连续,比如例子中的JISd 1

SELECT 类别, 流水号
FROM (
  SELECT 类别, 流水号, ROW_NUMBER() OVER (PARTITION BY 类别 ORDER BY 流水号) AS rn
  FROM your_table
) t
WHERE rn > 1
ORDER BY 类别, 流水号;


SELECT 类别, 流水号
FROM (
    SELECT 类别, 流水号, LAG(流水号) OVER (PARTITION BY 类别 ORDER BY 流水号) AS 前一个流水号
    FROM your_table
)
WHERE 流水号 - 前一个流水号 > 1 OR 前一个流水号 IS NULL
ORDER BY 类别, 流水号;

your_table 替换为你的实际表名

没看懂你想干个啥


SELECT 类别, 流水号
FROM (
  SELECT 类别, 流水号, ROW_NUMBER() OVER (PARTITION BY 类别 ORDER BY 流水号) AS rn
  FROM your_table
) t
WHERE rn > 1
ORDER BY 类别, 流水号;


你可以使用Python中的pandas库来处理这个问题。首先,我假设您的数据是按照您给出的格式存储在名为"input.txt"的文件中,且数据中每行都是有效的。

下面是一个简单的Python脚本,可以读取文件,对数据进行排序,然后按照您指定的格式输出数据:

import pandas as pd  
  
# 读取数据  
df = pd.read_csv('input.txt', sep=' ', header=None)  
  
# 将类别和流水号进行排序  
df.sort_values(by=[1], ascending=False, inplace=True)  
  
# 按照类别分组并输出每组的第一个流水号  
output = df.groupby(1).apply(lambda x: x.iloc[0][1])  
  
# 输出结果  
print(output)

这段代码首先使用pandas的read_csv函数读取文件,将每行数据转化为DataFrame中的一个行。然后,我们使用sort_values函数按照流水号的降序对数据进行排序。接着,我们使用groupby函数按照类别进行分组,并使用apply函数将每组的数据转化为只包含第一个流水号的DataFrame。最后,我们打印出这个只包含第一个流水号的DataFrame。

注意,这段代码假设数据中每行都是有效的,且每行都有两个值(类别和流水号)。如果您的数据不符合这些假设,您可能需要修改代码以适应您的数据。


SELECT
    类别,
    MIN(流水号) AS 流水号
FROM
    your_table
GROUP BY
    类别;

oracle不连续得时间如何分组,Oracle按不同时间分组统计的sql
可以参考下

引用 皆我百晓生 小程序回复内容作答:

要实现按照类别分组并只取不连续的流水号,可以使用LAG函数来找到不连续的流水号:

SELECT 类别, 流水号
FROM (
    SELECT 类别, 流水号, LAG(流水号) OVER (PARTITION BY 类别 ORDER BY 流水号) AS 上一个流水号
    FROM 表名
) t
WHERE 流水号 <> 上一个流水号+1 OR 上一个流水号 IS NULL

以上SQL语句中,子查询使用LAG函数获取每个类别的上一个流水号。然后在外部查询中,通过比较流水号与上一个流水号+1的大小判断是否连续。如果不连续或者上一个流水号为空,则返回该行记录。

应用在提供的示例数据上,可以得到以下结果:

类别 流水号


JISa 1
JISa 3
JISb 2