簡體   English   中英

如何使用單個列值的多個子字符串選擇 SQL 表中的行?

[英]How can I select rows in an SQL table by using multiple substrings of a single column value?

我正在使用 Oracle SQL Developer 查詢案例數據庫,我需要使用三個不同的標識符為每個案例選擇正確的行; 但是,我的問題是兩個標識符包含在同一個文本字符串中,我不知道如何解析它們以在查詢中使用。

在下表中,我需要使用的標識符是:

  1. ID-1 ,“Case”列中的字符 3–6(例如,“1001”),
  2. ID-2 ,“Case”列中的字符 8–9(例如,“01”)出現時(如果不出現則視為“00”),以及
  3. ID-3 ,“序列”列中的值(例如,“672”)。

源表

案件 序列 值 1 值 2
AA1001 672 73 195
AA1001 711 73 185
AA1001-01 680 73 185
AA1001-02 685 72 185
AA1001-02 699 72 182
AB1002 676 51 36
AB1002-01 701 48 39
AB1002-01 719 48 35
AB1002-02 707 51 38
AA1003 655 122 416
AA1003 683 113 416

我想為每個唯一的 ID-1 返回一行,這樣首先選擇 ID-2 的最大值,然后選擇該子集中ID-3 的最大值; 因此,查詢應僅返回上表中的以下三行。

結果表

案件 序列 值 1 值 2
AA1001-02 699 72 182
AB1002-02 707 51 38
AA1003 683 113 416

我嘗試使用以下方法為 ID-2 取最大值,但它只返回 ID-2 等於“02”的行。

SELECT * 
FROM table 
WHERE SUBSTR(Case,3,4) in ('1001','1002','1003') 
and SUBSTR(Case,8,2) = (SELECT MAX(SUBSTR(Case,8,2)) 
FROM table 
WHERE SUBSTR(Case,3,4) in ('1001','1002','1003'))

(最簡單的答案可能只是為 ID-2 添加一列;但是,源數據庫是嚴格只讀的,因此我無法進行此類更改。)

在 Oracle 12.1 及更高版本中,您可以使用match_recognize子句:

select case, sequence, value1, value2
from   (
         select t.*, substr(case, 3, 4) as id_1, substr(case, 8, 9) as id_2
         from   table_name t
       )
match_recognize(
  partition by id_1
  order     by id_2 desc nulls last, sequence desc nulls last
  all rows per match
  pattern   (^ x)
  define    x as null is null
);


CASE        SEQUENCE     VALUE1     VALUE2
--------- ---------- ---------- ----------
AA1001-02        699         72        182
AB1002-02        707         51         38
AA1003           683        113        416

您可以使用ROW_NUMBER()分析函數並通過以下方式找到要分區/排序的SUBSTR ings:

SELECT *
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER (
           PARTITION BY
             SUBSTR(Case, 3, 4)
           ORDER BY
             COALESCE(SUBSTR(Case, 8, 2), '00') DESC,
             Sequence DESC
         ) AS rn
  FROM   table_name t
)
WHERE rn = 1;

其中,對於您的示例數據:

CREATE TABLE table_name (Case, Sequence, Value1, Value2 ) AS
SELECT 'AA1001',    672,  73, 195 FROM DUAL UNION ALL
SELECT 'AA1001',    711,  73, 185 FROM DUAL UNION ALL
SELECT 'AA1001-01', 680,  73, 185 FROM DUAL UNION ALL
SELECT 'AA1001-02', 685,  72, 185 FROM DUAL UNION ALL
SELECT 'AA1001-02', 699,  72, 182 FROM DUAL UNION ALL
SELECT 'AB1002',    676,  51,  36 FROM DUAL UNION ALL
SELECT 'AB1002-01', 701,  48,  39 FROM DUAL UNION ALL
SELECT 'AB1002-01', 719,  48,  35 FROM DUAL UNION ALL
SELECT 'AB1002-02', 707,  51,  38 FROM DUAL UNION ALL
SELECT 'AA1003',    655, 122, 416 FROM DUAL UNION ALL
SELECT 'AA1003',    683, 113, 416 FROM DUAL;

輸出:

案件 序列 VALUE1 VALUE2 注冊護士
AA1001-02 699 72 182 1
AB1002-02 707 51 38 1
AA1003 683 113 416 1

db<> 在這里擺弄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM