Sql 获取oracle中串行组的第一个和最后一个

Sql 获取oracle中串行组的第一个和最后一个,sql,oracle,select,serialization,group-by,Sql,Oracle,Select,Serialization,Group By,我正在尝试从已排序的表中选择: +--------+-------+ | Serial | Group | +--------+-------+ | 0100 | 99 | | 0101 | 99 | | 0102 | 99 | | 096 | 92 | | 097 | 92 | | 099 | 93 | | 23 | 16 | | 95 | 87 | | 99 | 90 | | 100

我正在尝试从已排序的表中选择:

+--------+-------+
| Serial | Group |
+--------+-------+
| 0100   | 99    |
| 0101   | 99    |
| 0102   | 99    |
| 096    | 92    |
| 097    | 92    |
| 099    | 93    |
| 23     | 16    |
| 95     | 87    |
| 99     | 90    |
| 100    | 90    |
| 101    | 90    |
| 102    | 90    |
| a      | a     |
| b      | b     |
| c      | c     |
+--------+-------+
我想要第一张、最后一张和每组的数量:fsdfsdfsdf

+------------+----------+----------+
| fromSerial | toSerial | quantity |
+------------+----------+----------+
| 0100       | 0102     |        3 |
| 096        | 097      |        2 |
| 099        | 099      |        1 |
| 99         | 102      |        4 |
| 23         | 23       |        1 |
| 95         | 95       |        1 |
| a          | a        |        1 |
| b          | b        |        1 |
| c          | c        |        1 |
+------------+----------+----------+
我的问题


谢谢

您可以使用窗口分析函数row_number根据组列对数据进行分区 您还可以获得每个分区中的元素数 然后,您可以进行基于案例的聚合,以获取from和to序列号值

请尝试以下查询:

SELECT grp,
       Cast(Min(Cast(serial AS INT)) AS VARCHAR2(30)) fromserial,
       Cast(Max(Cast(serial AS INT)) AS VARCHAR2(30)) toserial,
       Count(*)                                       quantity
FROM   yourtable
WHERE  NVL(LENGTH(TRIM(TRANSLATE(serial, '0123456789', ' '))), 0) = 0
GROUP  BY grp
UNION
SELECT grp,
       Cast(Min(serial) AS VARCHAR2(30)) fromserial,
       Cast(Max(serial) AS VARCHAR2(30)) toserial,
       Count(*)                          quantity
FROM   yourtable
WHERE  NVL(LENGTH(TRIM(TRANSLATE(serial, '0123456789', ' '))), 0) != 0
GROUP  BY grp
ORDER  BY grp 
使用最小值、最大值和分组依据

并且,不要使用关键字组作为列名

SQL> WITH DATA AS(
  2  SELECT '0100'  Serial,  '99' "GROUP_1"   FROM dual UNION ALL
  3  SELECT  '0101' ,   '99'     FROM dual UNION ALL
  4   SELECT '0102' ,  '99'     FROM dual UNION ALL
  5   SELECT '096' ,    '92'     FROM dual UNION ALL
  6   SELECT '097' ,    '92'      FROM dual UNION ALL
  7   SELECT '099',     '93'      FROM dual UNION ALL
  8   SELECT '23'  ,    '16'      FROM dual UNION ALL
  9   SELECT '95'  ,    '87'     FROM dual UNION ALL
 10   SELECT '99'  ,    '90'     FROM dual UNION ALL
 11   SELECT '100' ,    '90'    FROM dual UNION ALL
 12   SELECT '101' ,    '90'    FROM dual UNION ALL
 13   SELECT '102' ,    '90'     FROM dual UNION ALL
 14   SELECT 'A' ,       'A'      FROM dual UNION ALL
 15   SELECT 'b'  ,     'b'      FROM dual UNION ALL
 16   SELECT 'c'  ,     'c'     FROM dual
 17   )
 18  SELECT MIN(serial) fromserial,
 19    MAX(Serial) toserial,
 20    COUNT(*) quantity
 21  FROM DATA
 22  GROUP BY group_1
 23  ORDER BY fromserial
 24  /

FROM TOSE   QUANTITY
---- ---- ----------
0100 0102          3
096  097           2
099  099           1
100  99            4
23   23            1
95   95            1
A    A             1
b    b             1
c    c             1

9 rows selected.

SQL>

你们做了什么?我发布了相同的解决方案,但我发现第四排与预期不符。我明白了,接球不错。该组的窗口设置已更改。无论如何,谢谢你指出这一点。但我看不出你的答案。您删除了吗?是的,我删除了它,并将在小改动后重新删除。谢谢,我看到第4行100 99 4与预期的99 102 4不匹配。@TuanAnhLuong,字符和数字的排序不一样。因此,“99”和99的排序不同。谢谢,我看到第4行100 99 4与预期的99 102 4不匹配。在同一组中是否有整数和字符序列的组合?所有序列号是否都包含数字或字符?现在检查是否有用。谢谢,我看到第3行100 99 4与预期的99 102 4不匹配。
SQL> WITH DATA AS(
  2  SELECT '0100'  Serial,  '99' "GROUP_1"   FROM dual UNION ALL
  3  SELECT  '0101' ,   '99'     FROM dual UNION ALL
  4   SELECT '0102' ,  '99'     FROM dual UNION ALL
  5   SELECT '096' ,    '92'     FROM dual UNION ALL
  6   SELECT '097' ,    '92'      FROM dual UNION ALL
  7   SELECT '099',     '93'      FROM dual UNION ALL
  8   SELECT '23'  ,    '16'      FROM dual UNION ALL
  9   SELECT '95'  ,    '87'     FROM dual UNION ALL
 10   SELECT '99'  ,    '90'     FROM dual UNION ALL
 11   SELECT '100' ,    '90'    FROM dual UNION ALL
 12   SELECT '101' ,    '90'    FROM dual UNION ALL
 13   SELECT '102' ,    '90'     FROM dual UNION ALL
 14   SELECT 'A' ,       'A'      FROM dual UNION ALL
 15   SELECT 'b'  ,     'b'      FROM dual UNION ALL
 16   SELECT 'c'  ,     'c'     FROM dual
 17   )
 18  SELECT MIN(serial) fromserial,
 19    MAX(Serial) toserial,
 20    COUNT(*) quantity
 21  FROM DATA
 22  GROUP BY group_1
 23  ORDER BY fromserial
 24  /

FROM TOSE   QUANTITY
---- ---- ----------
0100 0102          3
096  097           2
099  099           1
100  99            4
23   23            1
95   95            1
A    A             1
b    b             1
c    c             1

9 rows selected.

SQL>