Mysql SQL聚合正在运行的记录计数
我对SQL比较陌生,所以对于任何愚蠢的问题,我深表歉意,但我甚至无法接近这一点 我有一个客户订单数据集,其中包括客户ID和日期。我想返回一个查询,其中所有客户订单都添加了两个字段,“首次订单日期”和“订单数量” 任何指点都将不胜感激Mysql SQL聚合正在运行的记录计数,mysql,sql,Mysql,Sql,我对SQL比较陌生,所以对于任何愚蠢的问题,我深表歉意,但我甚至无法接近这一点 我有一个客户订单数据集,其中包括客户ID和日期。我想返回一个查询,其中所有客户订单都添加了两个字段,“首次订单日期”和“订单数量” 任何指点都将不胜感激 如果我理解正确,谢谢你: 您拥有的源数据: Cust_ID Date 5001 04/10/13 5001 11/10/13 5002 11/10/13 5001 17/10/13 5001
如果我理解正确,谢谢你: 您拥有的源数据:
Cust_ID Date
5001 04/10/13
5001 11/10/13
5002 11/10/13
5001 17/10/13
5001 24/10/13
5002 24/10/13
您期望的结果数据集:
Cust_ID Date FirstOrder OrderNumber
5001 04/10/13 04/10/13 1
5001 11/10/13 04/10/13 2
5002 11/10/13 11/10/13 1
5001 17/10/13 04/10/13 3
5001 24/10/13 04/10/13 4
5002 24/10/13 11/10/13 2
然后查询应该是(如果使用AF):
不包括AF,仅使用标准SQL:
SELECT S.Cust_ID, S.Date, MIN(J.Date) as FirstDate, Count(S.Cust_id)
FROM Orders S
INNER JOIN Orders J
ON S.Cust_ID = J.Cust_ID and S.Date >= J.Date
GROUP BY S.Cust_id, S.Date
你能试试这个吗
SELECT tab.Cust_ID, tab.Date, x.FirstOrder, x.orderCount
FROM tab INNER JOIN (
SELECT Cust_ID, MIN(Date) AS FirstOrder,
COUNT(*) AS orderCount
FROM tab
GROUP BY CustID
) x ON tab.Cust_ID = x.Cust_ID
内部查询为每个客户选择FirstOrder
和orderCount
,最后为每个订单加入
更新
使用用户变量
可以跟踪客户ID的订单计数顺序
SELECT *
FROM (
SELECT tab.Cust_ID, tab.Date AS Date, x.FirstOrder, x.orderCount,
IF(@prev_cust_id = tab.Cust_ID, @cnt := @cnt + 1, @cnt := 1)
FROM tab INNER JOIN (
SELECT Cust_ID, MIN(Date) AS FirstOrder,
COUNT(*) AS orderCount
FROM tab
GROUP BY CustID
) x ON tab.Cust_ID = x.Cust_ID,
(SELECT @prev_cust_id := 0, @cnt := 1) y
ORDER BY tab.Cust_ID
) x
ORDER BY Date;
选择foo.Cust\u ID
,foo.`日期`
,最小值(p.`Date`)作为第一订单
,COUNT(*)作为orderCount
来自富
加入富为p
在p.Cust\u id=foo.Cust\u id上
p.`Date`这个问题需要一个MySQL的答案。你写了代码吗?我写了,但没有取得任何进展,所以我没有发布任何东西。您下面的解决方案非常完美。除了它给出每个记录的总计数,而不是运行total@user3169268啊哈。我在工作中误解了你的问题。请稍等。@user3169268我已更新。但没有对你的数据进行测试。当前面的SQL不适合您时,请给我们一些关于SQLFIDLE的示例数据。
SELECT tab.Cust_ID, tab.Date, x.FirstOrder, x.orderCount
FROM tab INNER JOIN (
SELECT Cust_ID, MIN(Date) AS FirstOrder,
COUNT(*) AS orderCount
FROM tab
GROUP BY CustID
) x ON tab.Cust_ID = x.Cust_ID
SELECT *
FROM (
SELECT tab.Cust_ID, tab.Date AS Date, x.FirstOrder, x.orderCount,
IF(@prev_cust_id = tab.Cust_ID, @cnt := @cnt + 1, @cnt := 1)
FROM tab INNER JOIN (
SELECT Cust_ID, MIN(Date) AS FirstOrder,
COUNT(*) AS orderCount
FROM tab
GROUP BY CustID
) x ON tab.Cust_ID = x.Cust_ID,
(SELECT @prev_cust_id := 0, @cnt := 1) y
ORDER BY tab.Cust_ID
) x
ORDER BY Date;
SELECT foo.Cust_ID
, foo.`Date`
, MIN(p.`Date`) AS FirstOrder
, COUNT(*) AS orderCount
FROM foo
JOIN foo AS p
ON p.Cust_id = foo.Cust_id
AND p.`Date` <= foo.`Date`
GROUP BY foo.Cust_ID, foo.`Date`
ORDER BY foo.`Date`;