我有一个查询,返回在一个日期范围内商店的所有客户的购买。它工作得很好,但是现在我被要求修改结果,所以每天只返回每个客户的第一次购买。我需要SELECT语句来计算一个列,它意味着“这是客户当天的第N次购买”。数据已经按客户名称和日期排序,所以当客户名称或日期更改时,我希望计数器变量重置为1。
----------------------------------------------------------------
| Customer Name | Product | PurchaseDate | PurchaseNumberForDate |
----------------------------------------------------------------
| Customer A | ... | 2019-04-01 | 1 |
| Customer A | ... | 2019-04-02 | 1 |
| Customer A | ... | 2019-04-03 | 1 |
| Customer A | ... | 2019-04-03 | 2 |
| Customer A | ... | 2019-04-03 | 3 |
| Customer B | ... | 2019-04-03 | 1 |
| Customer B | ... | 2019-04-03 | 2 |
| Customer B | ... | 2019-04-04 | 1 |
----------------------------------------------------------------我尝试过使用MySQL变量,但我不知道如何在客户名称或购买日期更改时有条件地重置计数器。如果我能够正确计算PurchaseNumberForDate,我将使用它作为一个子查询,而另一个查询将选择WHERE PurchaseNumberForDate = 1。
我已经找到了大量使用COUNT()和@var := @var+1的示例,但我还没有找到基于多个条件的示例。这与MySQL是可能的吗?
发布于 2019-04-04 06:33:32
SELECT t.*,
CASE WHEN CONCAT(t.CustomerName, CHAR(0), t.PurchaseDate) = @group
THEN @num:=@num+1
ELSE @num:=1
END PurchaseNumberForDate,
@group:=CONCAT(t.CustomerName, CHAR(0), t.PurchaseDate) groupname
FROM datatable t, (SELECT @group:='', @num:=0) vars
ORDER BY t.CustomerName, t.PurchaseDate 没有附加字段的变体:
SELECT t.*,
CASE WHEN CONCAT(t.CustomerName, CHAR(0), t.PurchaseDate) = @group
THEN @num:=@num+1
ELSE @num:=1
END + CONCAT(CHAR(0), (@group:=CONCAT(t.CustomerName, CHAR(0), t.PurchaseDate))) PurchaseNumberForDate
FROM datatable t, (SELECT @group:='', @num:=0) vars
ORDER BY t.CustomerName, t.PurchaseDate;https://dba.stackexchange.com/questions/233885
复制相似问题