SQL在每个组中生成序列号

时间:2016-10-25 16:55:32

标签: sql sql-server tsql

 PO NO     Acc No    ResultSeqNo
    A1           12          1 
    A1           12          1
    A1           12          1
    A1           12          1
    A2           12          2 
    A2           12          2
    A2           12          2
    A3           13          1
    A3           13          1
    A4           13          2 
    A4           13          2
    A5           14          1 

在上表中,PONOAccNo是相关的,SeqNo只是旗帜中的计数器。我需要按PONoAccno进行分组。

如果您在上表中看到,A1A2具有相同的帐号,但所有A1都被视为一个组,因此所有人的seqNo应为1 A1A2也与A1具有相同的acc,但它是一个不同的组,因此它应该具有seq No 2.

换句话说:对于每个AccNo号码,我需要按PO NO生成序列号。因此,对于帐户#12,所有A1 PO NO记录都具有序列1,并且所有A2 PO NO记录具有序列2.对于帐户13,A3是1并且A4是2。 / p>

这是我到目前为止所做的:

UPDATE x 
SET x.ResultSeqNo = x.dr 
FROM 
  (
    SELECT SeqNo,dense_rank() over (order by PO NO) as dr 
    FROM [Purchaseorder] 
    WHERE status = 'In'
  ) x

2 个答案:

答案 0 :(得分:1)

您需要使用dense_rank分析函数,但为分组集添加partition by子句以生成序列号,如:

SELECT dense_rank() OVER (PARTITION BY acc_no ORDER BY po_no)

答案 1 :(得分:0)

  1. 在这里,您需要首先更新resultseqno字段,以便每一行 将被唯一标识。

  2. 我使用row_number()窗口函数对分区组中的resultseqno进行了编号

  3. 我为该row_number()字段赋予了别名r_num

  4. 之后,我使用子查询更新resultseqno

    UPDATE [YOUR_TABLE_NAME] x SET ResultSeqNo=rownum;
    UPDATE [YOUR_TABLE_NAME] x
    SET ResultSeqNo =
    
    (SELECT b.r_num
    FROM
        (SELECT rownum AS seq_order,
          a.*,
          row_number() over (partition BY Acc_No order by PO_NO) r_num
        FROM [YOUR_TABLE_NAME] a
        ) b
      WHERE x.po_no    =b.po_no
      AND x.ACC_NO     =b.ACC_NO
      AND x.ResultSeqNo=b.ResultSeqNo
      );