2017-12-26 4 views
-1

私はかなりSQLに新しいとしばらくの間このタスクを解決しようとしている..まだ運がない。ここの誰かが私を助けることができたら、私は感謝します。相関サブクエリ。最後の購入日の後に訪問数をカウントする

私は列を持つデータベースがあります ClientIDを、 VisitIDDatePurchaseID私が達成しようとしている何(配列) など

がある: ClientIDLast Visit DateFirst Visit DateLast Purchase Date, Visits Count, Purchases Count, Visits After Last Purchase Count

最後の購入後の訪問数 - ここで私は立ち往生しました。

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です。 USING事は(それが代わりにONの使用されている)絶対に正常

このクエリは私にエラー与えている:

DB::Exception: Column Date is not under aggregate function and not in 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 | 
    +----------+-----------------+------------------+--------------------+--------------+-----------------+----------------------------------+ 
+0

「テーブル」 – Strawberry

+0

エラーは自明です。 'Date'カラムはグループ化していないので、選択できません。 –

答えて

0

問題はです。 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) 
関連する問題