LeetCode-1336。の訪問あたりのトランザクション数(難しいです)

表:訪問

+ --------- + --------------- +
|カラム名|タイプ|
+ --------------- + + ---------
| user_idは| int型|
| VISIT_DATE | DATE |
+ --------------- + --------- +
(user_idは、 VISIT_DATE)テーブルの主キーである
テーブル内の行ごとにUSER_IDバンクアクセスを表すVISIT_DATE
 

表:取引

+ --------- + ------------------ +
|カラム名|タイプ|
+ ------------- + --------- + -----
| user_idは| int型|
| TRANSACTION_DATE上| DATE |
|金額| int型|
+ ------------------ + --------- +
テーブルは主キーを持っていないので、重複する行があってもよい
表の行ごとにUSER_ID TRANSACTION_DATEが取引額の量を表す完了
(TRANSACTION_DATEでユーザー(使用者)が銀行を訪れたことを確実にすることができますそのテーブルには訪問が含まれている(USER_ID、TRANSACTION_DATE)ライン)
 

銀行は1回の訪問での銀行の顧客でのトランザクションの数と取引チャートの最初の訪問の顧客の対応する番号を取得したいです

どのように多くの顧客が銀行へのSQLクエリのアクセスを書くが、多くの顧客が銀行取引などを訪問しましたか任意の取引を、行っていませんでした

結果は、2つのものがあります。

transactions_count:顧客取引が訪問
客の数はtransactions_countの中で対応するトランザクションにアクセスする際に一度:visits_count
0ユーザーから値transactions_countすべてのMAX(transactions_count)を訪問します 

transactions_countで並べ替え

以下は、クエリ結果のフォーマットの例を示します。

訪問表:
+ --------- + ------------ +
| USER_ID | visit_date |
+ --------- + ------------ +
| 1 | 2020年1月1日|
| 2 | 2020年1月2日|
| 12 | 2020年1月1日|
| 19 | 2020年1月3日|
| 1 | 2020年1月2日|
| 2 | 2020年1月3日|
| 1 | 2020年1月4日|
| 7 | 2020年1月11日|
| 9 | 2020年1月25日|
| 8 | 2020年1月28日|
+ --------- + ------------ +
取引表:
+ --------- + ------------ ------ + -------- +
| USER_ID | TRANSACTION_DATE | 量|
+ --------- + ------------------ + -------- +
| 1 | 2020年1月2日| 120 |
| 2 | 2020年1月3日| 22 |
| 7 | 2020年1月11日| 232 |
| 1 | 2020年1月4日| 7 |
| 9 | 2020年1月25日| 33は|
| 9 | 2020年1月25日| 66 |
| 8 | 2020から01 -28 | 1 |
| 9 | 2020年1月25日| 99 |
+ --------- + ------------------ + ---- ---- +
結果表:
+ -------------------- + -------------- +
| transactions_count | visits_count |
-------------------- -------------- + + +
| 0 | 4 |
| 1 | 5 |
| 2 | 0 |
| 3 | 1 |
+ -------------------- + -------------- +
* transactions_count = 0の場合、訪問(1、 "2020年1月1日")、(2、 '2020年1月2日')、(12、 '2020年1月1日')及び(19「2020- 01-03は「)= 4がそうvisits_count、取引されていません。
* transactions_count = 1の場合、訪問(2ため、 "2020年1月3日")、(7、 '2020年1月11日')、(8、 "2020年1月28日")、(1、「2020- 01-02「)と(1、 "2020年1月4日")はそうvisits_count = 5、取引を行いました。
* transactions_count = 2の場合は、銀行への顧客のアクセスはとてもvisits_count = 0、2回の取引を行っていません。
* transactions_count = 3の場合は、訪問(9、 "2020年1月25日")は、3つのトランザクションを行うので、visits_count = 1。
* transactions_count> = 4の場合は、銀行のクライアントへのアクセスなしにはありません、我々はtransactions_count = 3で停止して3倍以上の取引でした。

出典:滞在ボタン(LeetCode)
//leetcode-cn.com/problems/number-of-transactions-per-visit:リンク:httpsの
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。

モデレーションは:最初のテーブルには、テーブルを訪問し、それぞれの訪問を記録することであるが、必ずしもそうではないトランザクション、第2のテーブル記録トランザクション情報。ナンバー1と同様に、取引照会0回。

最初のテーブルレコード1日の訪問が、同じトランザクション内の何人かの人々一日に数回。

思考:

問題解決:

まず、各ユーザへの各訪問のために、トランザクション(トランザクション)の総数は、以下のSQLで取得することができます。

SELECT IFNULL(cnt, 0) cnt, COUNT(*) num FROM Visits t1 LEFT JOIN
(SELECT user_id, transaction_date, COUNT(*) cnt FROM Transactions GROUP BY user_id, transaction_date)t2
ON t1.user_id=t2.user_id AND visit_date=transaction_date GROUP BY IFNULL(cnt, 0)
-- 练习
select ifnull(cnt,0) cnt, count(*) num from visits t1 left join 
-- 查询这个id在这个日期下有几次交易。
(select user_id, transaction_date,count(*) cnt from Transactions 
group by user_id,transaction_date)t2
--
on t1.user_id = t2.user_id and visit_date = transaction_date group by ifnull(cnt,0)

そして、最終結果を得るために、最大値(N)は、この上記の値とJOINのためにそのテーブルに0からテーブルを生成する必要があります。考慮して最大の数字は、複数のテーブルのトランザクション、トランザクションオープンテーブルの数行より確かに、ない表示されます。

SELECT (@t := @t+1) AS id FROM Transactions t0, (SELECT @t := -1) b

その後、数が少なく、最大値はこのSQLによって得ることができる最大値に等しいよりましょう。

SELECT MAX(cnt) maxi FROM Visits t11 LEFT JOIN
(SELECT user_id, transaction_date, COUNT(*) cnt FROM Transactions GROUP BY user_id, transaction_date

 デジタル生成されたSQLテーブルは次のようになります。

SELECT (@t := @t+1) AS id FROM Transactions t0, (SELECT @t := -1) b,
(SELECT MAX(cnt) maxi FROM Visits t11 LEFT JOIN
(SELECT user_id, transaction_date, COUNT(*) cnt FROM Transactions GROUP BY user_id, transaction_date)t21
ON t11.user_id=t21.user_id AND visit_date=transaction_date) t31 WHERE @t < maxi

しかし、そこにこのような問題は、あるトランザクションが空の場合、0は、このデータを開いていないので、それを処理するので、その@tUNIONは0の結果行を手動その後、初めから、と:

SELECT (@t := @t+1) AS id FROM Transactions t0, (SELECT @t := 0) b,
(SELECT MAX(cnt) maxi FROM Visits t11 LEFT JOIN
(SELECT user_id, transaction_date, COUNT(*) cnt FROM Transactions GROUP BY user_id, transaction_date)t21
ON t11.user_id=t21.user_id AND visit_date=transaction_date) t31 WHERE @t < maxi 
 UNION SELECT 0

そして、デジタルメーターとの接続の開始時には、表1に残ってすることができます。

SELECT CEIL(id) transactions_count, IFNULL(num, 0) visits_count FROM
(SELECT (@t := @t+1) AS id FROM Transactions t0, (SELECT @t := 0) b,
(SELECT MAX(cnt) maxi FROM Visits t11 LEFT JOIN
(SELECT user_id, transaction_date, COUNT(*) cnt FROM Transactions GROUP BY user_id, transaction_date)t21
ON t11.user_id=t21.user_id AND visit_date=transaction_date) t31 WHERE @t < maxi 
 UNION SELECT 0) t33
LEFT JOIN
(SELECT IFNULL(cnt, 0) cnt, COUNT(*) num FROM Visits t1 LEFT JOIN
(SELECT user_id, transaction_date, COUNT(*) cnt FROM Transactions GROUP BY user_id, transaction_date)t2
ON t1.user_id=t2.user_id AND visit_date=transaction_date GROUP BY IFNULL(cnt, 0)) t3
ON t33.id=t3.cnt ORDER BY id

 知識ポイント:この質問は、中・深さの理解を続行する必要がより困難です

公開された144元の記事 ウォンの賞賛2 ビュー5730

おすすめ

転載: blog.csdn.net/Hello_JavaScript/article/details/104789422