【问题标题】:Populating random number by grouping通过分组填充随机数
【发布时间】:2014-09-19 03:51:33
【问题描述】:

我有以下 示例数据

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   0   29-Jun-11   15-Jul-11
1   CAT 1   X   0   15-Jul-11   28-Jul-11
1   CAT 1   X   0   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

预期输出:-

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

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

【问题讨论】:

  • 截图没有描述正在发生的事情,也没有描述应该发生的事情。
  • 感谢您的回复。我使用 SQL (rownum) 生成 SEQ 列。当“status”具有相同的值时,“SEQ”将具有一些不同的值(除了 rownum),例如。在这种情况下为 0。但是,如果同一组值再次出现在“status”中,那么“seq”列应该有一些不同的值,例如 00。但在我的情况下,我得到的每组状态值都为 0。希望这是有道理的。
  • @Harry,请编辑您的问题并在此处添加相关信息。也最好提供一些示例数据和预期的输出,而不是附上图片。
  • 您好,我更新了我的问题,还更新了样本和预期数据。不确定如何以正确的表格格式插入样本和预期数据。
  • 你的行是如何排序的?如果没有正确的 ORDER BY 子句,行是无序的,因此实际上不存在 "first 值集""second 这样的东西 一组值”。我怀疑这可能很复杂,你能想到一些 very minimal but executable example 吗?顺便说一句,当您回复 cmets 时,请尝试 ping 提问者(使用@pseudo。否则她甚至没有机会回到这里)。

标签: sql oracle random


【解决方案1】:

如果只为所有组获取一个单独的值就足够了,您可以使用SUM() OVER() 子句来生成组名。在这里,我假设 ORDER BY "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,SUM会为每一行生成相同的值(因为加0时总和不会改变),所以我们可以使用总和来生成组名。

An SQLfiddle to test with.

【讨论】:

  • 查询工作完美,但问题是如果我有像 STATUS START_DT END_DT E 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 查询不会为最后生成不同的 SEQ两个“E”状态。它将分配与前两个“E”状态相同的 SEQ,因为“I”状态的 SEQ 将为 0,并且在这种情况下总和不会改变。希望这是有道理的。谢谢
  • @Harry Hm,你能更新我用这些数据构建的 SQLfiddle 吗?以注释格式解析有点困难。
  • Sample SQL Fiddle 您会看到记录 3,4,5 和 8,9 具有相同的状态和 seq。我对这些组的要求是不同的 SEQ(一个用于 3,4,5,一个用于 8,9)
猜你喜欢
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
相关资源
最近更新 更多