<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>
<channel>
	<title>Comments on: How to divide consecutive rows into groups based on the value of the smallest running total in SQL</title>
	<atom:link href="http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/</link>
	<description>Oracle Question and Answer</description>
	<pubDate>Fri, 21 Nov 2008 00:47:38 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
		<item>
		<title>By: JB318</title>
		<link>http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-223</link>
		<dc:creator>JB318</dc:creator>
		<pubDate>Thu, 09 Aug 2007 16:36:46 +0000</pubDate>
		<guid isPermaLink="false">http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-223</guid>
		<description>Change the (5,7) in the input data to (5,8) and they're different again.</description>
		<content:encoded><![CDATA[<p>Change the (5,7) in the input data to (5,8) and they&#8217;re different again.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: jan.stulrajter</title>
		<link>http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-222</link>
		<dc:creator>jan.stulrajter</dc:creator>
		<pubDate>Thu, 09 Aug 2007 13:11:13 +0000</pubDate>
		<guid isPermaLink="false">http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-222</guid>
		<description>OK, I found the difference. This is OK now?

WITH x AS (
            SELECT 1 id, 10 value FROM dual UNION ALL
            SELECT 2 id,  8 value FROM dual UNION ALL
            SELECT 3 id,  5 value FROM dual UNION ALL
            SELECT 4 id, 10 value FROM dual UNION ALL
            SELECT 5 id,  7 value FROM dual UNION ALL
            SELECT 6 id,  8 value FROM dual UNION ALL
            SELECT 7 id,  4 value FROM dual
    ) 
SELECT
    id,value,
    SUM(value) OVER(PARTITION BY grp ORDER BY id) running_tot,
    FIRST_VALUE (cnt)OVER(PARTITION BY grp ORDER BY id) group_id
   FROM(SELECT 
           id,value,sum_cum,
           NVL(TRUNC(( sum_cum-value-1)/20),0) grp,
           COUNT(*) over(ORDER BY id) cnt
     FROM(SELECT 
             id,value,
             SUM(value) over(ORDER BY id) sum_cum
  FROM x))</description>
		<content:encoded><![CDATA[<p>OK, I found the difference. This is OK now?</p>
<p>WITH x AS (<br />
            SELECT 1 id, 10 value FROM dual UNION ALL<br />
            SELECT 2 id,  8 value FROM dual UNION ALL<br />
            SELECT 3 id,  5 value FROM dual UNION ALL<br />
            SELECT 4 id, 10 value FROM dual UNION ALL<br />
            SELECT 5 id,  7 value FROM dual UNION ALL<br />
            SELECT 6 id,  8 value FROM dual UNION ALL<br />
            SELECT 7 id,  4 value FROM dual<br />
    )<br />
SELECT<br />
    id,value,<br />
    SUM(value) OVER(PARTITION BY grp ORDER BY id) running_tot,<br />
    FIRST_VALUE (cnt)OVER(PARTITION BY grp ORDER BY id) group_id<br />
   FROM(SELECT<br />
           id,value,sum_cum,<br />
           NVL(TRUNC(( sum_cum-value-1)/20),0) grp,<br />
           COUNT(*) over(ORDER BY id) cnt<br />
     FROM(SELECT<br />
             id,value,<br />
             SUM(value) over(ORDER BY id) sum_cum<br />
  FROM x))</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: JB318</title>
		<link>http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-221</link>
		<dc:creator>JB318</dc:creator>
		<pubDate>Mon, 06 Aug 2007 16:23:17 +0000</pubDate>
		<guid isPermaLink="false">http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-221</guid>
		<description>OK, I needed to escape that less-than sign.  Once more, with feeling...

&lt;pre&gt;
SQL&#62; WITH x AS (
  2          SELECT 1 id, 10 value FROM dual UNION ALL
  3          SELECT 2 id,  8 value FROM dual UNION ALL
  4          SELECT 3 id,  5 value FROM dual UNION ALL
  5          SELECT 4 id, 10 value FROM dual UNION ALL
  6          SELECT 5 id,  7 value FROM dual UNION ALL
  7          SELECT 6 id,  8 value FROM dual UNION ALL
  8          SELECT 7 id,  4 value FROM dual
  9  )
 10  SELECT id,value, Running_tot, group_id
 11    FROM (SELECT id, value, Running_tot, group_id
 12           FROM (SELECT id, value, count(*) OVER( ) counter,
 13                        ROW_NUMBER() OVER (ORDER BY id) rn FROM x)
 14   MODEL
 15   DIMENSION BY (rn)
 16   MEASURES (id,value, counter,CAST(NULL AS NUMBER) Running_tot,
 17             value tmp, CAST(NULL AS NUMBER) group_id, CAST(NULL AS NUMBER) rown )
 18   RULES ITERATE(10000)
 19   UNTIL (ITERATION_NUMBER&#62;= counter[1])
 20   (
 21    Running_tot[ITERATION_NUMBER]
 22                          = CASE WHEN tmp[ITERATION_NUMBER-1] IS NULL
 23                                 THEN tmp[ITERATION_NUMBER]
 24                                 ELSE tmp[ITERATION_NUMBER] +
 25                                          Running_tot[cv()-1]
 26       END,
 27    tmp[ITERATION_NUMBER] = CASE WHEN Running_tot[ITERATION_NUMBER] &#60; 20     /* input */
 28                                 THEN  0
 29                     END,
 30    rown[ITERATION_NUMBER] = CASE WHEN Running_tot[CV()-1] IS NULL
 31                                  THEN 1
 32                                  WHEN tmp[ITERATION_NUMBER-1] IS NULL
 33                                  THEN ITERATION_NUMBER
 34                             END,
 35    group_id[ITERATION_NUMBER] = MAX(rown)[ANY]
 36    )
 37  )
 38  WHERE id IS NOT NULL
 39  ORDER BY id
 40  /

        ID      VALUE RUNNING_TOT   GROUP_ID
---------- ---------- ----------- ----------
         1         10          10          1
         2          8          18          1
         3          5          23          1
         4         10          10          4
         5          7          17          4
         6          8          25          4
         7          4           4          7

7 rows selected.

Elapsed: 00:00:00.01
&lt;/pre&gt;</description>
		<content:encoded><![CDATA[<p>OK, I needed to escape that less-than sign.  Once more, with feeling&#8230;</p>
<pre>
SQL&gt; WITH x AS (
  2          SELECT 1 id, 10 value FROM dual UNION ALL
  3          SELECT 2 id,  8 value FROM dual UNION ALL
  4          SELECT 3 id,  5 value FROM dual UNION ALL
  5          SELECT 4 id, 10 value FROM dual UNION ALL
  6          SELECT 5 id,  7 value FROM dual UNION ALL
  7          SELECT 6 id,  8 value FROM dual UNION ALL
  8          SELECT 7 id,  4 value FROM dual
  9  )
 10  SELECT id,value, Running_tot, group_id
 11    FROM (SELECT id, value, Running_tot, group_id
 12           FROM (SELECT id, value, count(*) OVER( ) counter,
 13                        ROW_NUMBER() OVER (ORDER BY id) rn FROM x)
 14   MODEL
 15   DIMENSION BY (rn)
 16   MEASURES (id,value, counter,CAST(NULL AS NUMBER) Running_tot,
 17             value tmp, CAST(NULL AS NUMBER) group_id, CAST(NULL AS NUMBER) rown )
 18   RULES ITERATE(10000)
 19   UNTIL (ITERATION_NUMBER&gt;= counter[1])
 20   (
 21    Running_tot[ITERATION_NUMBER]
 22                          = CASE WHEN tmp[ITERATION_NUMBER-1] IS NULL
 23                                 THEN tmp[ITERATION_NUMBER]
 24                                 ELSE tmp[ITERATION_NUMBER] +
 25                                          Running_tot[cv()-1]
 26       END,
 27    tmp[ITERATION_NUMBER] = CASE WHEN Running_tot[ITERATION_NUMBER] &lt; 20     /* input */
 28                                 THEN  0
 29                     END,
 30    rown[ITERATION_NUMBER] = CASE WHEN Running_tot[CV()-1] IS NULL
 31                                  THEN 1
 32                                  WHEN tmp[ITERATION_NUMBER-1] IS NULL
 33                                  THEN ITERATION_NUMBER
 34                             END,
 35    group_id[ITERATION_NUMBER] = MAX(rown)[ANY]
 36    )
 37  )
 38  WHERE id IS NOT NULL
 39  ORDER BY id
 40  /

        ID      VALUE RUNNING_TOT   GROUP_ID
---------- ---------- ----------- ----------
         1         10          10          1
         2          8          18          1
         3          5          23          1
         4         10          10          4
         5          7          17          4
         6          8          25          4
         7          4           4          7

7 rows selected.

Elapsed: 00:00:00.01
</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: JB318</title>
		<link>http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-220</link>
		<dc:creator>JB318</dc:creator>
		<pubDate>Mon, 06 Aug 2007 16:22:15 +0000</pubDate>
		<guid isPermaLink="false">http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-220</guid>
		<description>Looks like my entry got lopped off somehow...

&lt;pre&gt;
SQL&#62; WITH x AS (
  2          SELECT 1 id, 10 value FROM dual UNION ALL
  3          SELECT 2 id,  8 value FROM dual UNION ALL
  4          SELECT 3 id,  5 value FROM dual UNION ALL
  5          SELECT 4 id, 10 value FROM dual UNION ALL
  6          SELECT 5 id,  7 value FROM dual UNION ALL
  7          SELECT 6 id,  8 value FROM dual UNION ALL
  8          SELECT 7 id,  4 value FROM dual
  9  )
 10  SELECT id,value, Running_tot, group_id
 11    FROM (SELECT id, value, Running_tot, group_id
 12           FROM (SELECT id, value, count(*) OVER( ) counter,
 13                        ROW_NUMBER() OVER (ORDER BY id) rn FROM x)
 14   MODEL
 15   DIMENSION BY (rn)
 16   MEASURES (id,value, counter,CAST(NULL AS NUMBER) Running_tot,
 17             value tmp, CAST(NULL AS NUMBER) group_id, CAST(NULL AS NUMBER) rown )
 18   RULES ITERATE(10000)
 19   UNTIL (ITERATION_NUMBER&#62;= counter[1])
 20   (
 21    Running_tot[ITERATION_NUMBER]
 22                          = CASE WHEN tmp[ITERATION_NUMBER-1] IS NULL
 23                                 THEN tmp[ITERATION_NUMBER]
 24                                 ELSE tmp[ITERATION_NUMBER] +
 25                                          Running_tot[cv()-1]
 26       END,
 27    tmp[ITERATION_NUMBER] = CASE WHEN Running_tot[ITERATION_NUMBER] </description>
		<content:encoded><![CDATA[<p>Looks like my entry got lopped off somehow&#8230;</p>
<pre>
SQL&gt; WITH x AS (
  2          SELECT 1 id, 10 value FROM dual UNION ALL
  3          SELECT 2 id,  8 value FROM dual UNION ALL
  4          SELECT 3 id,  5 value FROM dual UNION ALL
  5          SELECT 4 id, 10 value FROM dual UNION ALL
  6          SELECT 5 id,  7 value FROM dual UNION ALL
  7          SELECT 6 id,  8 value FROM dual UNION ALL
  8          SELECT 7 id,  4 value FROM dual
  9  )
 10  SELECT id,value, Running_tot, group_id
 11    FROM (SELECT id, value, Running_tot, group_id
 12           FROM (SELECT id, value, count(*) OVER( ) counter,
 13                        ROW_NUMBER() OVER (ORDER BY id) rn FROM x)
 14   MODEL
 15   DIMENSION BY (rn)
 16   MEASURES (id,value, counter,CAST(NULL AS NUMBER) Running_tot,
 17             value tmp, CAST(NULL AS NUMBER) group_id, CAST(NULL AS NUMBER) rown )
 18   RULES ITERATE(10000)
 19   UNTIL (ITERATION_NUMBER&gt;= counter[1])
 20   (
 21    Running_tot[ITERATION_NUMBER]
 22                          = CASE WHEN tmp[ITERATION_NUMBER-1] IS NULL
 23                                 THEN tmp[ITERATION_NUMBER]
 24                                 ELSE tmp[ITERATION_NUMBER] +
 25                                          Running_tot[cv()-1]
 26       END,
 27    tmp[ITERATION_NUMBER] = CASE WHEN Running_tot[ITERATION_NUMBER]</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: JB318</title>
		<link>http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-219</link>
		<dc:creator>JB318</dc:creator>
		<pubDate>Mon, 06 Aug 2007 16:21:16 +0000</pubDate>
		<guid isPermaLink="false">http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-219</guid>
		<description>That doesn't change the fact that you're not resetting the cumulative sum when you need to.

&lt;pre&gt;
SQL&#62; set echo on
SQL&#62; @go1
SQL&#62; WITH x AS (
  2          SELECT 1 id, 10 value FROM dual UNION ALL
  3          SELECT 2 id,  8 value FROM dual UNION ALL
  4          SELECT 3 id,  5 value FROM dual UNION ALL
  5          SELECT 4 id, 10 value FROM dual UNION ALL
  6          SELECT 5 id,  7 value FROM dual UNION ALL
  7          SELECT 6 id,  8 value FROM dual UNION ALL
  8          SELECT 7 id,  4 value FROM dual
  9  )
 10  SELECT
 11  id,
 12  value,
 13  SUM(value) OVER (PARTITION BY grp ORDER BY id) running_tot,
 14  FIRST_VALUE(cnt) OVER (PARTITION BY grp ORDER BY id) group_id
 15  FROM (
 16          SELECT
 17          id,
 18          value,
 19          sum_cum,
 20          NVL(TRUNC((sum_cum-value)/20),0) grp,
 21          count(*) over(ORDER BY id) cnt
 22          FROM (
 23                  SELECT
 24                  id,
 25                  value,
 26                  SUM(value) over (ORDER BY id) sum_cum
 27                  FROM x
 28          )
 29  )
 30  /

        ID      VALUE RUNNING_TOT   GROUP_ID
---------- ---------- ----------- ----------
         1         10          10          1
         2          8          18          1
         3          5          23          1
         4         10          10          4
         5          7          17          4
         6          8           8          6
         7          4          12          6

7 rows selected.

Elapsed: 00:00:00.01
SQL&#62;
SQL&#62; WITH x AS (
  2          SELECT 1 id, 10 value FROM dual UNION ALL
  3          SELECT 2 id,  8 value FROM dual UNION ALL
  4          SELECT 3 id,  5 value FROM dual UNION ALL
  5          SELECT 4 id, 10 value FROM dual UNION ALL
  6          SELECT 5 id,  7 value FROM dual UNION ALL
  7          SELECT 6 id,  8 value FROM dual UNION ALL
  8          SELECT 7 id,  4 value FROM dual
  9  )
 10  SELECT id,value, Running_tot, group_id
 11    FROM (SELECT id, value, Running_tot, group_id
 12           FROM (SELECT id, value, count(*) OVER( ) counter,
 13                        ROW_NUMBER() OVER (ORDER BY id) rn FROM x)
 14   MODEL
 15   DIMENSION BY (rn)
 16   MEASURES (id,value, counter,CAST(NULL AS NUMBER) Running_tot,
 17             value tmp, CAST(NULL AS NUMBER) group_id, CAST(NULL AS NUMBER) rown )
 18   RULES ITERATE(10000)
 19   UNTIL (ITERATION_NUMBER&#62;= counter[1])
 20   (
 21    Running_tot[ITERATION_NUMBER]
 22                          = CASE WHEN tmp[ITERATION_NUMBER-1] IS NULL
 23                                 THEN tmp[ITERATION_NUMBER]
 24                                 ELSE tmp[ITERATION_NUMBER] +
 25                                          Running_tot[cv()-1]
 26       END,
 27    tmp[ITERATION_NUMBER] = CASE WHEN Running_tot[ITERATION_NUMBER] </description>
		<content:encoded><![CDATA[<p>That doesn&#8217;t change the fact that you&#8217;re not resetting the cumulative sum when you need to.</p>
<pre>
SQL&gt; set echo on
SQL&gt; @go1
SQL&gt; WITH x AS (
  2          SELECT 1 id, 10 value FROM dual UNION ALL
  3          SELECT 2 id,  8 value FROM dual UNION ALL
  4          SELECT 3 id,  5 value FROM dual UNION ALL
  5          SELECT 4 id, 10 value FROM dual UNION ALL
  6          SELECT 5 id,  7 value FROM dual UNION ALL
  7          SELECT 6 id,  8 value FROM dual UNION ALL
  8          SELECT 7 id,  4 value FROM dual
  9  )
 10  SELECT
 11  id,
 12  value,
 13  SUM(value) OVER (PARTITION BY grp ORDER BY id) running_tot,
 14  FIRST_VALUE(cnt) OVER (PARTITION BY grp ORDER BY id) group_id
 15  FROM (
 16          SELECT
 17          id,
 18          value,
 19          sum_cum,
 20          NVL(TRUNC((sum_cum-value)/20),0) grp,
 21          count(*) over(ORDER BY id) cnt
 22          FROM (
 23                  SELECT
 24                  id,
 25                  value,
 26                  SUM(value) over (ORDER BY id) sum_cum
 27                  FROM x
 28          )
 29  )
 30  /

        ID      VALUE RUNNING_TOT   GROUP_ID
---------- ---------- ----------- ----------
         1         10          10          1
         2          8          18          1
         3          5          23          1
         4         10          10          4
         5          7          17          4
         6          8           8          6
         7          4          12          6

7 rows selected.

Elapsed: 00:00:00.01
SQL&gt;
SQL&gt; WITH x AS (
  2          SELECT 1 id, 10 value FROM dual UNION ALL
  3          SELECT 2 id,  8 value FROM dual UNION ALL
  4          SELECT 3 id,  5 value FROM dual UNION ALL
  5          SELECT 4 id, 10 value FROM dual UNION ALL
  6          SELECT 5 id,  7 value FROM dual UNION ALL
  7          SELECT 6 id,  8 value FROM dual UNION ALL
  8          SELECT 7 id,  4 value FROM dual
  9  )
 10  SELECT id,value, Running_tot, group_id
 11    FROM (SELECT id, value, Running_tot, group_id
 12           FROM (SELECT id, value, count(*) OVER( ) counter,
 13                        ROW_NUMBER() OVER (ORDER BY id) rn FROM x)
 14   MODEL
 15   DIMENSION BY (rn)
 16   MEASURES (id,value, counter,CAST(NULL AS NUMBER) Running_tot,
 17             value tmp, CAST(NULL AS NUMBER) group_id, CAST(NULL AS NUMBER) rown )
 18   RULES ITERATE(10000)
 19   UNTIL (ITERATION_NUMBER&gt;= counter[1])
 20   (
 21    Running_tot[ITERATION_NUMBER]
 22                          = CASE WHEN tmp[ITERATION_NUMBER-1] IS NULL
 23                                 THEN tmp[ITERATION_NUMBER]
 24                                 ELSE tmp[ITERATION_NUMBER] +
 25                                          Running_tot[cv()-1]
 26       END,
 27    tmp[ITERATION_NUMBER] = CASE WHEN Running_tot[ITERATION_NUMBER]</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: jan.stulrajter</title>
		<link>http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-218</link>
		<dc:creator>jan.stulrajter</dc:creator>
		<pubDate>Mon, 06 Aug 2007 15:44:59 +0000</pubDate>
		<guid isPermaLink="false">http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-218</guid>
		<description>And now?

SELECT
id,value,
SUM(value) OVER(PARTITION BY grp ORDER BY id) running_tot,
FIRST_VALUE (cnt)OVER(PARTITION BY grp ORDER BY id) group_id
FROM(SELECT id,value,sum_cum,
NVL(TRUNC(( sum_cum-value)/20),0) grp,
count(*) over(ORDER BY id) cnt
FROM(SELECT id,value,
SUM(value) over(ORDER BY id) sum_cum
FROM x))</description>
		<content:encoded><![CDATA[<p>And now?</p>
<p>SELECT<br />
id,value,<br />
SUM(value) OVER(PARTITION BY grp ORDER BY id) running_tot,<br />
FIRST_VALUE (cnt)OVER(PARTITION BY grp ORDER BY id) group_id<br />
FROM(SELECT id,value,sum_cum,<br />
NVL(TRUNC(( sum_cum-value)/20),0) grp,<br />
count(*) over(ORDER BY id) cnt<br />
FROM(SELECT id,value,<br />
SUM(value) over(ORDER BY id) sum_cum<br />
FROM x))</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: JB318</title>
		<link>http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-217</link>
		<dc:creator>JB318</dc:creator>
		<pubDate>Mon, 06 Aug 2007 15:27:39 +0000</pubDate>
		<guid isPermaLink="false">http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-217</guid>
		<description>Alas, that's not the same since you don't restart the count when you create a new group.  If you have a running total of 18 and your group size is 20, and the next row adds 5, 18 + 5 = 23 &#62; 20 so you start a new group, but the running total is now 3, when it should be 0--you don't want to cut the subsequent group when there are only 17 more items.</description>
		<content:encoded><![CDATA[<p>Alas, that&#8217;s not the same since you don&#8217;t restart the count when you create a new group.  If you have a running total of 18 and your group size is 20, and the next row adds 5, 18 + 5 = 23 &gt; 20 so you start a new group, but the running total is now 3, when it should be 0&#8211;you don&#8217;t want to cut the subsequent group when there are only 17 more items.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: jan.stulrajter</title>
		<link>http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-216</link>
		<dc:creator>jan.stulrajter</dc:creator>
		<pubDate>Mon, 06 Aug 2007 13:12:49 +0000</pubDate>
		<guid isPermaLink="false">http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-216</guid>
		<description>The same (I hope) using Analytics:

SELECT 
  id,value,
  SUM(value) OVER(PARTITION BY group_id ORDER BY id) running_tot,
  group_id
    FROM(SELECT id,value,sum_cum,       
                NVL(TRUNC(( sum_cum-value)/:input),0) group_id  
        FROM(SELECT id,value, 
             SUM(value) over(ORDER BY id) sum_cum
   FROM x))</description>
		<content:encoded><![CDATA[<p>The same (I hope) using Analytics:</p>
<p>SELECT<br />
  id,value,<br />
  SUM(value) OVER(PARTITION BY group_id ORDER BY id) running_tot,<br />
  group_id<br />
    FROM(SELECT id,value,sum_cum,<br />
                NVL(TRUNC(( sum_cum-value)/:input),0) group_id<br />
        FROM(SELECT id,value,<br />
             SUM(value) over(ORDER BY id) sum_cum<br />
   FROM x))</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Frank Zhou</title>
		<link>http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-215</link>
		<dc:creator>Frank Zhou</dc:creator>
		<pubDate>Fri, 03 Aug 2007 18:31:17 +0000</pubDate>
		<guid isPermaLink="false">http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-215</guid>
		<description>Thanks for pointing out this special case !
The query has fixed.</description>
		<content:encoded><![CDATA[<p>Thanks for pointing out this special case !<br />
The query has fixed.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: JB318</title>
		<link>http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-214</link>
		<dc:creator>JB318</dc:creator>
		<pubDate>Fri, 03 Aug 2007 16:15:51 +0000</pubDate>
		<guid isPermaLink="false">http://oraqa.com/2007/08/02/how-to-divide-consecutive-rows-into-groups-based-on-the-value-of-the-smallest-running-total-in-sql/#comment-214</guid>
		<description>...except I forgot to backport, it should look like:

&lt;pre&gt;
rown[ITERATION_NUMBER] =
	CASE WHEN Running_tot[CV()-1] IS NULL
	THEN 1
	--WHEN Running_tot[CV()-1] &#62; Running_tot[CV()]
	WHEN tmp[ITERATION_NUMBER-1] IS NULL
	THEN ITERATION_NUMBER
	END,
&lt;/pre&gt;

You were using "tmp" both as the source of numbers to add, and as a flag of when to cut to the next group.  I split that by using "value" directly, and "tmp" became "flag".</description>
		<content:encoded><![CDATA[<p>&#8230;except I forgot to backport, it should look like:</p>
<pre>
rown[ITERATION_NUMBER] =
	CASE WHEN Running_tot[CV()-1] IS NULL
	THEN 1
	--WHEN Running_tot[CV()-1] &gt; Running_tot[CV()]
	WHEN tmp[ITERATION_NUMBER-1] IS NULL
	THEN ITERATION_NUMBER
	END,
</pre>
<p>You were using &#8220;tmp&#8221; both as the source of numbers to add, and as a flag of when to cut to the next group.  I split that by using &#8220;value&#8221; directly, and &#8220;tmp&#8221; became &#8220;flag&#8221;.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
