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