Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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_Oracle_Random - Fatal编程技术网

Sql 分组填充随机数

Sql 分组填充随机数,sql,oracle,random,Sql,Oracle,Random,我有以下样本数据 预期输出:- “seq”列是sql生成的列,基本上是rownum。对于状态列中的同一组值,“seq”值应保持不变,如本例中的0。但是对于下一组相同的状态值,“seq”值应该与前一组不同,例如0A。对于所有其他情况,seq值仅为rownum。 谢谢如果只需要为所有组获取一个单独的值就足够了,那么可以使用SUM()OVER()子句来生成组名。在这里,我假设按“Start DT”、“End DT”、“Seq”排序的足以获得正确的行顺序,因此如果不正确,您可能需要对其进行调整 WITH

我有以下样本数据

预期输出:-

“seq”列是sql生成的列,基本上是rownum。对于状态列中的同一组值,“seq”值应保持不变,如本例中的0。但是对于下一组相同的状态值,“seq”值应该与前一组不同,例如0A。对于所有其他情况,seq值仅为rownum。
谢谢

如果只需要为所有组获取一个单独的值就足够了,那么可以使用
SUM()OVER()
子句来生成组名。在这里,我假设按“Start DT”、“End DT”、“Seq”排序的
足以获得正确的行顺序,因此如果不正确,您可能需要对其进行调整

WITH cte AS (
  SELECT "ID", "Category", "Status", "Seq", "Start DT", "End DT", 
    SUM("Seq") OVER (ORDER BY "Start DT", "End DT", "Seq") "Seq2"
  FROM mytable
) 
SELECT "ID", "Category", "Status", 
  CASE WHEN "Seq"=0 
       THEN 'A' || CAST("Seq2" AS VARCHAR(32))
       ELSE CAST("Seq" AS VARCHAR(32)) 
       END "Seq",
  "Start DT", "End DT" 
FROM cte
由于我们要分组的值的值为0,因此总和将为每一行生成相同的值(因为当我们添加0时,总和不会改变),因此我们可以使用总和生成组名


.

屏幕截图没有描述正在发生的事情,也没有描述应该发生的事情。感谢您的回复。我使用SQL(rownum)生成SEQ列。当“status”具有相同的值时,“SEQ”将具有一些不同的值(rownum除外),例如在本例中为0。但是,如果“status”再次出现相同的值组,“seq”列应该有一些不同的值,例如00。但在我的例子中,每一组状态值都是0。希望这会有意义。@Harry,请编辑你的问题并在那里添加相关信息。也最好提供一些样本数据和预期输出,而不是附加图片。嗨,我更新了我的问题,也更新了样本和预期数据。不确定如何以正确的表格格式插入样本和预期数据。行的顺序如何?如果没有适当的
ORDER BY
子句,行是无序的,因此实际上不存在“第一组值”或“第二组值”。我怀疑这可能很复杂,你能想出一些吗?顺便说一句,当你回复评论时,尝试ping询问者(使用
@pseudo
。否则她回来的机会很小)。该查询工作正常,但问题是如果我有状态开始日期结束日期03/FEB/12 08/FEB/12 E 08/FEB/12 13/JUL/12 I 13/JUL/12 31/JUL/12 I 31/JUL/12 28/AUG/12 E 28/AUG/12 06/SEP/12 E 06/SEP/12 10/DEC/12之类的数据,则查询不会为最后两个“E”状态生成不同的序列。它将为前两个“E”状态分配相同的SEQ,因为对于“I”状态,SEQ都将为0,并且在这种情况下总和不会改变。希望这是有意义的。Thanks@Harry嗯,你能用这些数据更新我构建的SQLfiddle吗?用注释格式解析有点困难。您将看到记录3,4,5和8,9具有相同的状态和顺序。我对这些组的要求不同(一个用于3,4,5,一个用于8,9)
ID  Category    Status  Seq Start DT    End DT
1   CAT 1   U   1   17-Feb-11   17-Feb-11
1   CAT 1   I   2   17-Feb-11   17-Feb-11
1   CAT 1   X   0   17-Feb-11   3-Mar-11
1   CAT 1   X   0   3-Mar-11    4-Mar-11
1   CAT 1   X   0   4-Mar-11    28-Jun-11
1   CAT 1   I   6   28-Jun-11   29-Jun-11
1   CAT 1   X   ***0A***    29-Jun-11   15-Jul-11
1   CAT 1   X   ***0A***    15-Jul-11   28-Jul-11
1   CAT 1   X   ***0A***    28-Jul-11   28-Jul-11
1   CAT 1   I   10  28-Jul-11   1-Aug-11
1   CAT 1   D   11  1-Aug-11    8-Aug-11
1   CAT 1   E   0   8-Aug-11    9-Aug-11
1   CAT 1   E   0   9-Aug-11    1-Sep-11
1   CAT 1   E   0   1-Sep-11    13-Sep-11
WITH cte AS (
  SELECT "ID", "Category", "Status", "Seq", "Start DT", "End DT", 
    SUM("Seq") OVER (ORDER BY "Start DT", "End DT", "Seq") "Seq2"
  FROM mytable
) 
SELECT "ID", "Category", "Status", 
  CASE WHEN "Seq"=0 
       THEN 'A' || CAST("Seq2" AS VARCHAR(32))
       ELSE CAST("Seq" AS VARCHAR(32)) 
       END "Seq",
  "Start DT", "End DT" 
FROM cte