Mysql 相关子查询。统计上次购买日期后的访问次数

Mysql 相关子查询。统计上次购买日期后的访问次数,mysql,sql,Mysql,Sql,我对SQL非常陌生,并且已经尝试解决这个任务一段时间了。。还是不走运。如果这里有人能帮我,我将不胜感激 我有一个包含列的数据库: ClientID, VisitID, 日期, PurchaseID(数组) 等 我想要实现的是: ClientID, 上次就诊日期, 首次就诊日期, 上次购买日期, 访问次数, 采购数量, 上次购买计数后的访问次数 上次购物计数后的访问-我在这里卡住了 SELECT ClientID, FirstVisit, LastVisit, LastPurchaseDa

我对SQL非常陌生,并且已经尝试解决这个任务一段时间了。。还是不走运。如果这里有人能帮我,我将不胜感激

我有一个包含列的数据库:
ClientID
VisitID
日期
PurchaseID
(数组) 等

我想要实现的是:
ClientID
上次就诊日期
首次就诊日期
上次购买日期
访问次数
采购数量
上次购买计数后的访问次数

上次购物计数后的访问-我在这里卡住了

SELECT 
ClientID, 
FirstVisit, 
LastVisit, 
LastPurchaseDate, 
Visits, 
Purchases, 
VisitsAfterPurchase
FROM 
(
SELECT 
    h.ClientID, 
    max(h.Date) AS LastVisit, 
    min(h.Date) AS FirstVisit, 
    count(VisitID) AS Visits
FROM s7_visits AS h 
WHERE Date > '2017-12-01'
GROUP BY h.ClientID
LIMIT 100
) 
ANY LEFT JOIN 
(
SELECT 
    d.ClientID, 
    max(d.Date) AS LastPurchaseDate, 
    sum(length(d.PurchaseID)) AS Purchases, 
    sum(
    (
        SELECT count(x.VisitID)
        FROM s7_visits AS x 
        WHERE x.ClientID = d.ClientID
        HAVING x.Date >= max(d.Date)
    )) AS VisitsAfterPurchase
FROM s7_visits AS d 
WHERE (length(PurchaseID) > 0) AND (Date > '2017-12-01')
GROUP BY d.ClientID
) USING (ClientID)
我使用的数据库是Yandex Clickhouse。
使用
东西是绝对正常的(它被使用而不是打开)

此查询给我错误信息:

DB::Exception:列日期不在聚合函数下,也不在GROUP BY

样本数据:

  +----------+---------+------------+------------+
  | CliendID | VisitID |    Date    | PurchaseID |
  +----------+---------+------------+------------+
  |      123 |     136 | 01.12.2017 |            |
  |      123 |     522 | 05.12.2017 |            |
  |      123 |     883 | 08.12.2017 |            |
  |      123 |     293 | 09.12.2017 | ['345']    |
  |      123 |     278 | 12.12.2017 |            |
  |      123 |     508 | 12.12.2017 |            |
  |      123 |     562 | 15.12.2017 |            |
  |      123 |     523 | 21.12.2017 |            |
  |      456 |     736 | 29.11.2017 |            |
  |      456 |     417 | 03.12.2017 |            |
  |      456 |     950 | 04.12.2017 |            |
  |      456 |     532 | 05.12.2017 | ['346']    |
  |      456 |     880 | 09.12.2017 |            |
  |      456 |     296 | 12.12.2017 |            |
  |      456 |     614 | 15.12.2017 |            |
  +----------+---------+------------+------------+
结果是:

  +----------+-----------------+------------------+--------------------+--------------+-----------------+----------------------------------+
  | ClientID | Last Visit Date | First Visit Date | Last Purchase Date | Visits Count | Purchases Count | Visits After Last Purchase Count |
  +----------+-----------------+------------------+--------------------+--------------+-----------------+----------------------------------+
  |      123 |      21.12.2017 |       01.12.2017 |         09.12.2017 |            8 |               1 |                                4 |
  |      456 |      15.12.2017 |       29.11.2017 |         05.12.2017 |            7 |               1 |                                3 |
  +----------+-----------------+------------------+--------------------+--------------+-----------------+----------------------------------+

问题是由于
的x.Date>=MAX(d.Date)
造成的。引用
x.Date
列没有任何意义,因为您首先聚合
x.ClientID=d.ClientID
的所有行,而
x.Date
将仅来自该组中随机选择的行

如果要选择要计数的行,则需要在
WHERE
子句中执行此操作。因此子查询应该是:

(
SELECT 
    d.ClientID, 
    max(d.Date) AS LastPurchaseDate, 
    sum(length(d.PurchaseID)) AS Purchases, 
    sum(
    (
        SELECT count(x.VisitID)
        FROM s7_visits AS x 
        WHERE x.ClientID = d.ClientID AND x.Date >= max(d.Date)
    )) AS VisitsAfterPurchase
FROM s7_visits AS d 
WHERE (length(PurchaseID) > 0) AND (Date > '2017-12-01')
GROUP BY d.ClientID
) USING (ClientID)

你有一个“表格”,错误是不言自明的。无法选择
日期
列,因为您没有按该列进行分组。