@@ -190,6 +190,7 @@ yy.Select = class Select {
190190 // todo?: 3. Compile SELECT clause
191191 // For ROWNUM()
192192 query . rownums = [ ] ;
193+ query . grouprownums = [ ] ;
193194
194195 this . compileSelectGroup0 ( query ) ;
195196
@@ -371,6 +372,46 @@ yy.Select = class Select {
371372 }
372373 }
373374
375+ // Handle GROUP_ROW_NUMBER() and ROW_NUMBER() OVER (PARTITION BY ...) - restart numbering when grouping column(s) change
376+ if ( query . grouprownums && query . grouprownums . length > 0 ) {
377+ for ( var j = 0 , jlen = query . grouprownums . length ; j < jlen ; j ++ ) {
378+ var config = query . grouprownums [ j ] ;
379+ var partitionColumns ;
380+
381+ // Determine which columns to partition by
382+ if ( config . partitionColumns && config . partitionColumns . length > 0 ) {
383+ // Use explicit PARTITION BY columns
384+ partitionColumns = config . partitionColumns ;
385+ } else {
386+ // Fall back to first column for GROUP_ROW_NUMBER()
387+ var columnKeys = Object . keys ( res [ 0 ] || { } ) ;
388+ partitionColumns = [ columnKeys [ 0 ] ] ;
389+ }
390+
391+ var prevValues = null ;
392+ var rowNum = 0 ;
393+
394+ for ( var i = 0 , ilen = res . length ; i < ilen ; i ++ ) {
395+ // Get current partition key (combination of all partition columns)
396+ var currentValues = partitionColumns
397+ . map ( function ( col ) {
398+ return res [ i ] [ col ] ;
399+ } )
400+ . join ( '|' ) ;
401+
402+ // Reset counter when partition changes
403+ if ( i === 0 || currentValues !== prevValues ) {
404+ rowNum = 1 ;
405+ } else {
406+ rowNum ++ ;
407+ }
408+
409+ res [ i ] [ config . as ] = rowNum ;
410+ prevValues = currentValues ;
411+ }
412+ }
413+ }
414+
374415 var res2 = modify ( query , res ) ;
375416
376417 if ( cb ) {
0 commit comments