SQL - 通过添加新列返回购买的产品的顺序

时间:2016-06-23 14:45:51

标签: mysql sql

我正在处理另一个SQL查询。 我有下表。

购买

ID CUST_ID PROD_CODE PURCH_DATE
1  1       'WER'     01/12/2012 
2  2       'RRE'     02/10/2005
3  3       'RRY'     02/11/2011
4  3       'TTB'     15/05/2007
5  3       'GGD'     20/06/2016
6  2       'SSD'     02/10/2011

我正在尝试添加另一个列PURCH_COUNT,该列将根据PURCH_DATE显示CUST_ID的购买计数。 如果这是第一次购买,它将返回1,如果是秒,则返回2,依此类推。 所以我希望的结果是:

ID CUST_ID PROD_CODE PURCH_DATE  PURCH_COUNT
1  1       'WER'     01/12/2012  1
2  2       'RRE'     02/10/2005  1
3  3       'RRY'     02/11/2011  2
4  3       'TTB'     15/05/2007  1
5  3       'GGD'     20/06/2016  3
6  2       'SSD'     02/10/2011  2

提前致谢!

3 个答案:

答案 0 :(得分:2)

样本数据

DECLARE @Table1 TABLE 
    (ID int, CUST_ID int, PROD_CODE varchar(7), PURCH_DATE datetime)
;

INSERT INTO @Table1
    (ID, CUST_ID, PROD_CODE, PURCH_DATE)
VALUES
    (1, 1, 'WER', '2012-01-12 05:30:00'),
    (2, 2, 'RRE', '2005-02-10 05:30:00'),
    (3, 3, 'RRY', '2011-02-11 05:30:00'),
    (4, 3, 'TTB', '2008-03-05 05:30:00'),
    (5, 3, 'GGD', '2017-08-06 05:30:00'),
    (6, 2, 'SSD', '2011-02-10 05:30:00')
;

IN SQL:

select ID, 
CUST_ID, 
PROD_CODE, 
PURCH_DATE,
ROW_NUMBER()OVER(PARTITION BY CUST_ID ORDER BY (SELECT NULL))RN 
        from @Table1

在MySql中:

SELECT a.ID, a.CUST_ID,a.PROD_CODE,a.PURCH_DATE, (
    SELECT count(*) from @Table1 b where a.CUST_ID >= b.CUST_ID AND a.ID = b.ID
) AS row_number FROM @Table1 a

答案 1 :(得分:1)

使用相关的子查询来获取每位客户的计数。

SELECT t.*,
 (SELECT 1+count(*)
   FROM table1
   WHERE t.cust_id = cust_id
     AND t.purch_date > purch_date) as purch_cnt
FROM table1 t
ORDER BY cust_id,purch_date

SQL Fiddle

答案 2 :(得分:1)

任何相关的子查询或窗口函数也可以表示为连接。有时,连接更容易理解,或者是由可以重复使用的组件生成的,有时DBMS不支持更高级的功能。 (AFAIK,SELECT子句中的子查询是非标准的。)

create table T
    (ID, CUST_ID, PROD_CODE, PURCH_DATE);

INSERT INTO T
    (ID, CUST_ID, PROD_CODE, PURCH_DATE)
VALUES
    (1, 1, 'WER', '2012-01-12 05:30:00'),
    (2, 2, 'RRE', '2005-02-10 05:30:00'),
    (3, 3, 'RRY', '2011-02-11 05:30:00'),
    (4, 3, 'TTB', '2008-03-05 05:30:00'),
    (5, 3, 'GGD', '2017-08-06 05:30:00'),
    (6, 2, 'SSD', '2011-02-10 05:30:00')
;

select PURCH_COUNT, T.*
from T join (
    select   count(b.ID) as PURCH_COUNT
           , a.CUST_ID, a.PURCH_DATE
    from T as a join T as b
    on  a.CUST_ID = b.CUST_ID
    and b.PURCH_DATE <= a.PURCH_DATE
    group by a.CUST_ID, a.PURCH_DATE
) as Q
on  T.CUST_ID = Q.CUST_ID
and T.PURCH_DATE = Q.PURCH_DATE
;

子查询的输出:

PURCH_COUNT  CUST_ID     PURCH_DATE         
-----------  ----------  -------------------
1            1           2012-01-12 05:30:00
1            2           2005-02-10 05:30:00
2            2           2011-02-10 05:30:00
1            3           2008-03-05 05:30:00
2            3           2011-02-11 05:30:00
3            3           2017-08-06 05:30:00

查询输出:

PURCH_COUNT  ID          CUST_ID     PROD_CODE   PURCH_DATE         
-----------  ----------  ----------  ----------  -------------------
1            1           1           WER         2012-01-12 05:30:00
1            2           2           RRE         2005-02-10 05:30:00
2            3           3           RRY         2011-02-11 05:30:00
1            4           3           TTB         2008-03-05 05:30:00
3            5           3           GGD         2017-08-06 05:30:00
2            6           2           SSD         2011-02-10 05:30:00