2009-12-07 59 views
2

我下表在Oracle数据库:如何仅使用SQL将相关数字分配给行?

InvoiceNumber InvoiceDate InvoiceCorrelative 
------------- ----------- ------------------ 
      123 02-03-2009     0 
      124 02-03-2009     0 
      125 02-04-2009     0 
      126 02-04-2009     0 
      127 02-04-2009     0 
      128 02-05-2009     0 
      129 02-06-2009     0 
      130 02-06-2009     0 
      ...   ...    ... 

我想为每个行的InvoiceCorrelative列中的值,以具有数字序列从1开始的每个日期。在上面的例子中我想表看起来像这样:

InvoiceNumber InvoiceDate InvoiceCorrelative 
------------- ----------- ------------------ 
      123 02-03-2009     1 
      124 02-03-2009     2 
      125 02-04-2009     1 
      126 02-04-2009     2 
      127 02-04-2009     3 
      128 02-05-2009     1 
      129 02-06-2009     1 
      130 02-06-2009     2 
      ...   ...    ... 

是否有可能只使用SQL语句做到这一点?我一直在玩rownum,但没有得到任何地方。

回答

10

尝试:

ROW_NUMBER() OVER (PARTITION BY InvoiceDate ORDER BY InvoiceNumber) 
+0

这将与MSSQL工作,但看标签,提问者是使用Oracle。 – 2009-12-07 20:49:39

+1

快看看说ROW_NUMBER()从Oracle 10g +是支持的,但DENSE_RANK是9I:http://techonthenet.com/oracle/functions/dense_rank.php – 2009-12-07 20:52:28

+1

@Josh斯米顿:我认为甲骨文发明的分析功能和Microsoft复制他们@OMG小马:有趣的链接! – Andomar 2009-12-07 20:54:55

5

使用标准的SQL,

Update TableName T Set 
    InvoiceCorrelative = 
    (Select Count(*) From TableName 
     Where InvoiceDate = T.InvoiceDate 
     And InvoiceNumber <= T.InvoiceNumber) 
+0

这个答案比接受的要好得多。它完全不会在查看你使用的数据库。只是纯粹的SQL! – 2012-04-05 18:56:57

相关问题