Oracle SQL -为一对值创建标识符

d7v8vwbk  于 2022-11-03  发布在  Oracle
关注(0)|答案(2)|浏览(196)

我正在努力解决以下问题,我在一个表中有以下数据:
| 参数ID|参数瓦尔|其他列|
| - -|- -|- -|
| 一个|十五个|第三十章|
| 一个|十五个|第三十章|
| 一个|十六岁|第三十章|
| 一个|十六岁|第三十章|
| 2个|二十一个|第三十章|
| 2个|二十一个|第三十章|
| 2个|二十二个|第三十章|
| 2个|二十二个|第三十章|
我想选择一个新的列,以便创建4组数据,以获得参数1和2的值之间的所有可能组合;所以我想得到这样东西:
| 设定|参数ID|参数瓦尔|其他列|
| - -|- -|- -|- -|
| 一个|一个|十五个|第三十章|
| 2个|一个|十五个|第三十章|
| 三个|一个|十六岁|第三十章|
| 四个|一个|十六岁|第三十章|
| 一个|2个|二十一个|第三十章|
| 三个|2个|二十一个|第三十章|
| 2个|2个|二十二个|第三十章|
| 四个|2个|二十二个|第三十章|
因此,例如,对于集合1,I将具有值15和21的对,对于集合2,值15和22等。
我尝试使用不同的分析函数,但我不能有我需要的。提前感谢。

eyh26e7m

eyh26e7m1#

尽管MODEL子句有一个很好的提示,但我想我会选择一个结合了交叉连接和逆透视的解决方案,也许它不是最好的,但它符合我的需要。

WITH tbl AS
(
       Select 1 "ID", 15 "VAL" From Dual Union All
       Select 1 "ID", 16 "VAL" From Dual Union All
       Select 2 "ID", 21 "VAL" From Dual Union All
       Select 2 "ID", 22 "VAL" From Dual )
SELECT *
FROM   (
              SELECT ROWNUM AS SET_ID,
                     id1,
                     id4
              FROM   (
                            SELECT
                                   CASE a.id
                                          WHEN 1 THEN a.val
                                          ELSE 0
                                   END AS id1,
                                   CASE a.id
                                          WHEN 2 THEN a.val
                                          ELSE 0
                                   END AS id2,
                                   CASE b.id
                                          WHEN 1 THEN b.val
                                          ELSE 0
                                   END AS id3,
                                   CASE b.id
                                          WHEN 2 THEN b.val
                                          ELSE 0
                                   END AS id4
                            FROM   tbl a,
                                   tbl b)
              WHERE  id2 = 0
              AND    id3 = 0) UNPIVOT (VAL FOR ID IN (id1 AS '1',
                                                      id4 AS '2'))

其结果是:
| 设置标识|识别码|瓦尔|
| - -|- -|- -|
| 一个|一个|十五个|
| 一个|2个|二十一个|
| 2个|一个|十五个|
| 2个|2个|二十二个|
| 三个|一个|十六岁|
| 三个|2个|二十一个|
| 四个|一个|十六岁|
| 四个|2个|二十二个|
尝试了所有源数据的组合,似乎起作用了:)

webghufk

webghufk2#

示例数据:

WITH
    tbl AS
        (
            Select 1 "ID", 15 "VAL" From Dual Union All
            Select 1 "ID", 15 "VAL" From Dual Union All
            Select 1 "ID", 16 "VAL" From Dual Union All
            Select 1 "ID", 16 "VAL" From Dual Union All
            Select 2 "ID", 21 "VAL" From Dual Union All
            Select 2 "ID", 21 "VAL" From Dual Union All
            Select 2 "ID", 22 "VAL" From Dual Union All
            Select 2 "ID", 22 "VAL" From Dual 
        )

在评论后更新

如果您需要组合,则必须使用MODEL子句。为此,您应该准备一些数据(cte命名网格),以便您可以对特定数据进行寻址并管理您需要的所有组合。它如下所示:

grid AS
        ( Select  Distinct
                  Sum(1) OVER(Partition By ID Order By ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) "IDS_TOTAL_ORDER",
                  Sum(1) OVER(Partition By VAL Order By VAL ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) "VALS_TOTAL_ORDER",
                  ID "ID",  
                  VAL "VAL"
            From
                  tbl   
            Order By ID 
        )
Select     SET_ID, ID, VAL
From (   Select   0 "SET_ID", IDS_TOTAL_ORDER, VALS_TOTAL_ORDER, ID "ID", VAL "VAL"
         From     grid  
     )
    MODEL
        Dimension By (ID, IDS_TOTAL_ORDER, VALS_TOTAL_ORDER)
        Measures(SET_ID, VAL)
        RULES
            (
                SET_ID[1, ANY, ANY] = CV(IDS_TOTAL_ORDER),
                SET_ID[2, 1, 1] = CV(IDS_TOTAL_ORDER),
                SET_ID[2, 2, 2] = CV(IDS_TOTAL_ORDER) + 1,
                SET_ID[2, 3, 1] = CV(IDS_TOTAL_ORDER) - 1,
                SET_ID[2, 4, 2] = CV(IDS_TOTAL_ORDER)
            )
Order By  ID, IDS_TOTAL_ORDER

这样你就可以得到任何组合。下面是你的结果:
| 设置标识|识别码|瓦尔|
| - -|- -|- -|
| 一个|一个|十五个|
| 2个|一个|十五个|
| 三个|一个|十六岁|
| 四个|一个|十六岁|
| 一个|2个|二十一个|
| 三个|2个|二十一个|
| 2个|2个|二十二个|
| 四个|2个|二十二个|
有关MODEL子句的详细信息:https://www.oracle.com/webfolder/technetwork/tutorials/obe/db/10g/r2/prod/bidw/sqlmodel/sqlmodel_otn.htm
集合现在如下所示:
| 设置标识|IDS_值|
| - -|- -|
| 一个|1月15日、2月21日|
| 2个|1月15日、2月22日|
| 三个|1月16日、2月21日|
| 四个|1月16日、2月22日|
此致。

相关问题