2013-03-27 113 views
0

对此问题有很多类似的问题,但我找不到一种方法来完成我正在尝试执行的操作。我需要在列中保留重复条目的运行结果,并在“所有者编号”列中报告该编号。下面的例子:在MySQL中保留重复记录的运行记录

Roll Number | Owner Name | Owner Number 
000001  | Patrick H. | 1 
000001  | Paula H. | 2 
000002  | Fred R.  | 1 
000003  | Chris P. | 1 
000003  | Kayla A. | 2 
000003  | Phil J.  | 3 

换句话说,我只需要计算每卷有多少业主有到这一点,不只是业主每卷的总数。任何帮助将不胜感激。

回答

0

您可以使用子查询或两年@variable

即做到这一点http://sqlfiddle.com/#!2/7c2fa/7

SELECT 

    -- Re-selected at this level to tidy up the calculation fields 
    f.rollNumber, 
    f.ownerName, 
    f.ownerNumber 

FROM (
    SELECT 

    d.rollNumber, 
    d.ownerName, 
    -- If the current roll number equals the previous, increment, else reset to 1 
    @i := IF([email protected],@i+1,1) AS ownerNumber, 
    -- Sets @last to be == the "current" one for use on next row 
    @last := d.rollNumber 

    FROM 
    (
     -- Get the raw data ordered by roll number 
     SELECT 

      LPAD(rollNumber,6,'0') rollNumber, 
      ownerName 

     FROM someTable 
     -- Reorder/filter as much as you like, but always rollNumber ASC first 
     ORDER BY 
      rollNumber ASC, 
      ownerName ASC 
) d,(
     -- Set up the variables we will need shortly 
     SELECT @i:=0,@last:=0 
) v 
) f; 
+0

巨大的感谢,这工作出色!仍然在学习MySQL的变量方面,这真的有助于把它放到视角。 – Aeide 2013-03-27 18:28:52

+0

听起来很好,起初可能有点头疼,但用得很好,可以在您的查询中打开更多的可能性。有了这样的事情,你只需要记住你正在做的事情的顺序 - 一旦你在最高层次,你可以按照你喜欢的任何方式重新排序,但是没有ownerNumber改变,因为在那时它是固定的:)(尝试添加例如一个'ORDER BY f.ownerName DESC') – 2013-03-27 18:30:59

1

MySQL不支持窗口的功能,但它可以通过使用变量来实现:

SET @num=0; 
SET @roll=''; 
SELECT `Roll Number`,`Owner Name`,`Owner Number` 
FROM 
(
SELECT `Roll Number`, 
`Owner Name`, 
(CASE WHEN @roll=`Roll Number` 
          THEN @num:[email protected]+1 ELSE 
          @num:=1 END) as `Owner Number`, 
@roll:=`Roll Number` 
FROM table1 
) as q; 

http://sqlfiddle.com/#!2/788a4/5