Mysql 相关子查询。统计上次购买日期后的访问次数
我对SQL非常陌生,并且已经尝试解决这个任务一段时间了。。还是不走运。如果这里有人能帮我,我将不胜感激 我有一个包含列的数据库:Mysql 相关子查询。统计上次购买日期后的访问次数,mysql,sql,Mysql,Sql,我对SQL非常陌生,并且已经尝试解决这个任务一段时间了。。还是不走运。如果这里有人能帮我,我将不胜感激 我有一个包含列的数据库: ClientID, VisitID, 日期, PurchaseID(数组) 等 我想要实现的是: ClientID, 上次就诊日期, 首次就诊日期, 上次购买日期, 访问次数, 采购数量, 上次购买计数后的访问次数 上次购物计数后的访问-我在这里卡住了 SELECT ClientID, FirstVisit, LastVisit, LastPurchaseDa
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)
你有一个“表格”,错误是不言自明的。无法选择
日期
列,因为您没有按该列进行分组。