Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 日期和铲斗容量序列号_Sql_Database_Oracle_Partition - Fatal编程技术网

Sql 日期和铲斗容量序列号

Sql 日期和铲斗容量序列号,sql,database,oracle,partition,Sql,Database,Oracle,Partition,我不能给我的问题一个合适的标题。让我举例说明 假设我有下表 输入 我想要什么 首先,我想按日期dd-MM-yyy对事务进行分组 然后我想创建一个最多包含2项的块/桶。因此,我想为2个项目的每个区块/桶分配一个子批次参考id。在每个区块/存储桶中,事务必须恰好属于一个日期。 SUB_BATCH_REF_ID的约定是BATCH_REF{chunk/bucket的全局序列号} 一个区块或存储桶最多可以包含两个相同日期的项目 我知道,除了像SQL这样的面向数据的语言之外,任何高级编程语言都可以很容易地实

我不能给我的问题一个合适的标题。让我举例说明

假设我有下表

输入

我想要什么

首先,我想按日期dd-MM-yyy对事务进行分组 然后我想创建一个最多包含2项的块/桶。因此,我想为2个项目的每个区块/桶分配一个子批次参考id。在每个区块/存储桶中,事务必须恰好属于一个日期。 SUB_BATCH_REF_ID的约定是BATCH_REF{chunk/bucket的全局序列号} 一个区块或存储桶最多可以包含两个相同日期的项目 我知道,除了像SQL这样的面向数据的语言之外,任何高级编程语言都可以很容易地实现这一点,但我没有这样的规定。为了更好地理解,可以将解决方案形成以下伪代码:

伪码

非常感谢您的帮助

这不是最佳解决方案。您的实际问题是一个相当复杂的图形问题——因为您希望事务在所有日期中只使用一次

一种解决方案是为事务分配工作日期。以下操作是随机进行的:

SELECT T.*
FROM (SELECT T.*,
             ROW_NUMBER() over (PARTITION BY TRUNC(INSERT_DATE) ORDER BY TRANSACTION_ID) AS rn
      FROM (SELECT T.*,
                   ROW_NUMBER() OVER (PARTITION BY BATCH_REF, TRANSACTION_ID ORDER BY DBMS_RANDOM.RANDOM) as seqnum
            FROM TRANSACTION T
            ) T
      WHERE BATCH_REF = 'XYZ' AND 
            SEQNUM = 1
     ) T
WHERE rn <= 2;

谢谢你的回答。我已经更新了示例输入和预期输出,因为最后4个条目有错误的相同事务ID。您能否建议,即使可以通过存储过程或多个SQL来实现,是否有一个最佳的解决方案来解决此问题。
SELECT 
T.*,
ROW_NUMBER() over (PARTITION BY TRUNC(INSERT_DATE) ORDER BY TRANSACTION_ID) rn
FROM TRANSACTION T
WHERE BATCH_REF='XYZ'
SELECT T.*
FROM (SELECT T.*,
             ROW_NUMBER() over (PARTITION BY TRUNC(INSERT_DATE) ORDER BY TRANSACTION_ID) AS rn
      FROM (SELECT T.*,
                   ROW_NUMBER() OVER (PARTITION BY BATCH_REF, TRANSACTION_ID ORDER BY DBMS_RANDOM.RANDOM) as seqnum
            FROM TRANSACTION T
            ) T
      WHERE BATCH_REF = 'XYZ' AND 
            SEQNUM = 1
     ) T
WHERE rn <= 2;