Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:如何创建序列号列_Sql Server - Fatal编程技术网

Sql server SQL Server:如何创建序列号列

Sql server SQL Server:如何创建序列号列,sql-server,Sql Server,我有一个包含以下数据的销售表: | SalesId | CustomerId | Amount | |---------|------------|--------| | 1 | 1 | 100 | | 2 | 2 | 75 | | 3 | 1 | 30 | | 4 | 3 | 49 | | 5 | 1

我有一个包含以下数据的销售表:

| SalesId | CustomerId | Amount |  
|---------|------------|--------|  
| 1       | 1          | 100    |  
| 2       | 2          | 75     |  
| 3       | 1          | 30     |  
| 4       | 3          | 49     |  
| 5       | 1          | 93     |  
我想在此表中插入一列,告诉我们客户购买的次数。所以它会像:

| SalesId | CustomerId | Amount | SalesNum |  
|---------|------------|--------|----------|  
| 1       | 1          | 100    | 1        |  
| 2       | 2          | 75     | 1        |  
| 3       | 1          | 30     | 2        |  
| 4       | 3          | 49     | 1        |  
| 5       | 1          | 93     | 3        |  
所以我可以在salesId=5中看到,这是customerId=1的第三个事务。如何编写这样的查询来插入/更新这样的列?我使用MS SQL,但我也对MYSQL解决方案感兴趣,如果我将来需要在那里这样做的话

多谢各位

对表格格式表示歉意。无法正确设置格式。

请尝试以下操作-

SELECT SalesId, CustomerId, Amount, 
SalesNum = ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY SalesId) 
FROM YOURTABLE
使用子查询

   Select *, (Select count(customerid) 
               from ##tmp t
               where t.salesid <= s.salesid
               and      t.customerid = s.customerid)
from ##tmp s
您需要分配一个序列号。不过,我强烈建议不要存储此值,因为每次更新都需要重新计算它,相反,如果您需要定期创建视图,最好是:

CREATE VIEW dbo.SalesWithRank
AS
    SELECT  SalesID,
            CustomerID,
            Amount,
            SalesNum = ROW_NUMBER() OVER(PARTITION BY CustomerID ORDER BY SalesID)
    FROM    Sales;
GO
ROW_NUMBER不会在同一组中分配重复的行,例如,如果您根据金额分配行,并且同一客户的两次销售均为100,则它们不会具有相同的SalesNum,如果ROW_NUMBER函数中没有任何其他订购条件,则它们将被随机排序。如果希望相同金额的销售额具有相同的SalesNum,则需要使用RANK或DENSE_RANK。密集_秩在序列中没有间隙,例如1、1、2、2、3,而秩将从相应位置开始,例如1、1、3、3、5

如果必须作为更新执行此操作,则可以使用:

WITH CTE AS
(   SELECT  SalesID,
            CustomerID,
            Amount,
            SalesNum,
            NewSalesNum = ROW_NUMBER() OVER(PARTITION BY CustomerID ORDER BY SalesID)
    FROM    Sales
)
UPDATE  CTE
SET     SalesNum = NewSalesNum;
MySQL没有排名函数,因此您需要使用局部变量,通过跟踪前一行的值来实现排名。这在视图中是不允许的,因此只要在需要行号的地方重复此逻辑即可:

SELECT  s.SalesID,
        s.Amount,
        @r:= CASE WHEN @c = s.CustomerID THEN @r + 1 ELSE 1 END AS SalesNum,
        @c:= CustomerID AS CustomerID
FROM    Sales AS s
        CROSS JOIN (SELECT @c:= 0, @r:= 0) AS var
ORDER BY s.CustomerID, s.SalesID;
order by在这里非常重要,这意味着为了在不影响排名的情况下对结果进行排序,您需要使用子查询:

SELECT  SalesID,
        Amount,
        CustomerID,
        SalesNum
FROM    (   SELECT  s.SalesID,
                    s.Amount,
                    @r:= CASE WHEN @c = s.CustomerID THEN @r + 1 ELSE 1 END AS SalesNum,
                    @c:= CustomerID AS CustomerID
            FROM    Sales AS s
                    CROSS JOIN (SELECT @c:= 0, @r:= 0) AS var
            ORDER BY s.CustomerID, s.SalesID
        ) AS s
ORDER BY s.SalesID;
同样,我建议不要存储该值,但如果必须在MySQL中存储,则可以使用:

UPDATE  Sales
        INNER JOIN
        (   SELECT  s.SalesID,
                    @r:= CASE WHEN @c = s.CustomerID THEN @r + 1 ELSE 1 END AS NewSalesNum,
                    @c:= CustomerID AS CustomerID
            FROM    Sales AS s
                    CROSS JOIN (SELECT @c:= 0, @r:= 0) AS var
            ORDER BY s.CustomerID, s.SalesID
        ) AS s2
            ON Sales.SalesID = s2.SalesID
SET     SalesNum = s2.NewSalesNum;

+1较慢,但应同时在SQL Server和MySQL上运行;我使用MS SQL,但我也对MYSQL解决方案感兴趣,如果我将来需要在那里这样做的话。