みんな「ゴールデンナインシルバーテン」と言っていて、10月がもうすぐ終わります。まだまだいい仕事を見つけていない小さなパートナーがたくさんいると思います。筆記試験では、申請者の論理的思考をテストするための「興味深い」SQL質問が常に1つか2つあります。これは、職場に不慣れな「初心者」にとっても非常に不親切です。心配しないでください。このブログでは、ブロガーがインタビューに頻繁に表示される「SQL」で書かれたテスト質問をいくつかまとめて、次のインタビューで先を行くのに役立てています。勢いは壊れた竹のようです。
1。3日以上ログインしているユーザーにクエリを実行します
これは非常に古典的な質問であり、ここに1つの考え方があります。
テーブル情報は次のとおりです。
ステップ1:ユーザーのログイン日の重複を排除する
ユーザーは同じ日に複数回ログインする可能性があるため、最初にユーザーのログイン日を使用して重複を排除する必要があります。
select DISTINCT date(date) as "日期",id from demo01;
検索結果:
ステップ2:row_number()over()関数を使用してカウントします
重複排除の最初のステップの結果として、ウィンドウを開き、IDでグループ化し、日付で昇順で並べ替え、各日付のランキングを取得できます。
select *,row_number() over(PARTITION by id order by `日期`) as cum from (select DISTINCT date(date) as `日期`,id from demo01)a;
クエリ結果:
これを見ると、誰もがすでに「謎」を見ていると思います〜なぜこのステップで時間を並べ替える必要があるのですか?
row_numberでウィンドウを開いた後のランキングは連続していることがわかります。したがって、日付も連続している場合、それらの差は固定値ではありませんか?
ステップ3:日付からカウント値を差し引いて結果を取得します
Jungeはここでのデモンストレーションにhqlを使用しているため、このdate_sub
関数を使用してここで日付の差を取得します。
select *,date_sub(`日期`,cum) as `结果` from (select *,row_number() over(PARTITION by id order by `日期`) as cum from (select DISTINCT date(date) as `日期`,id from demo01)a)b;
検索結果:
ステップ4:IDと結果でグループ化し、カウントを計算します
最後のステップでは、ステップ3で取得した差に基づいてカウントを直接計算し、IDと差をグループ化します。3日以上継続してログインする必要がある場合は、カウント数が3以上であると直接判断できます。
select id,count(*) from (select *,date_sub(`日期`,cum) as `结果` from (select *,row_number() over(PARTITION by id order by `日期`) as cum from (select DISTINCT date(date) as `日期`,id from demo01)a)b)c GROUP BY id,`结果` having count(*)>=3;
運用結果:
回答が出ました。ID1、3のユーザーは3日以上継続してログインし、それぞれ3日、4日継続してログインしています。
2.各ユーザーの累積訪問数をカウントします
これは筆記試験でよく見られるトピックでもあり、作者の考えに応じて復習することができます。
テーブル情報は次のとおりです。
次の表に示すように、SQLを使用して各ユーザーの累積アクセス時間をカウントする必要があります。
ユーザーID | 月 | 小計 | 累積 |
---|---|---|---|
u01 | 2017-01 | 11 | 11 |
u01 | 2017-02 | 12 | 23 |
u02 | 2017-01 | 12 | 12 |
u03 | 2017-01 | 8 | 8 |
u04 | 2017-01 | 3 | 3 |
ステップ1:データ形式を変更する
チェックインの必要性に応じて達成された結果から逆推力-データパケットを入力するので、元のデータのプロセスの最初のステップです。
select
userId,
date_format(regexp_replace(visitDate,'/','-'),'yyyy-MM') mn,
visitCount
from
action;t1
プロセス結果:
ステップ2:1人あたりの月間訪問数を計算します
サブクエリの見栄えを良くするために、t1を使用して前の手順の結果を置き換えます。この手順により、各ユーザーの月間トラフィックを取得できます。
select
userId,
mn,
sum(visitCount) mn_count
from
t1
group by userId,mn;t2
クエリの結果:
ステップ3:月ごとの総訪問数を計算します
変数t2を使用して、2番目のステップの結果を表します。この時点で、合計ウィンドウ機能を使用してユーザーIDをグループ化し、mn時間で並べ替えます。
select
userId,
mn,
mn_count,
sum(mn_count) over(partition by userId order by mn) mn_all
from t2;
最終結果:
完全なSQL
注意:上記の手順は不完全なSQLを示しています。前の手順のSQLステートメントの代わりに各手順で変数を使用するのは、全員を表示するためです。実際、操作の結果は、作成者が完全なSQLを入力して実行することです。
select
userId,
mn,
mn_count,
sum(mn_count) over(partition by userId order by mn) mn_all
from
( select
userId,
mn,
sum(visitCount) mn_count
from
(select
userId,
date_format(regexp_replace(visitDate,'/','-'),'yyyy-MM') mn,
visitCount
from
action)t1
group by userId,mn)t2;
3.グループTopN
50Wの店舗があり、各顧客がいずれかの店舗の商品にアクセスすると、アクセスログが生成されます。アクセスログに保存されるテーブルはVisit、訪問者のユーザーIDはuser_id、訪問したショップの名前はshopです。
要件:各店舗への訪問数上位3件の訪問者情報。ストア名、訪問者ID、および訪問数を出力します。
ステップ1:各ユーザーが各ショップにアクセスした回数を照会する
最終的には各店舗の上位3回の訪問のユーザー情報を取得する必要があるため、このステップでは、最初に各店舗の各ユーザーの訪問数を計算します。
select shop,user_id,count(*) ct
from visit
group by shop,user_id;t1
計算結果:
ステップ2:ユーザーが各店舗にアクセスした回数のランキングを計算します
最初のステップで各店舗の下を訪れたユーザーの訪問数で、上位3つを取得したいと考えています。ウィンドウ関数ランクを使用する必要があることは間違いありません。
何人かの友人は、なぜrow_numberを使用できないのかと尋ねるかもしれません。
主な理由は、同じデータのrow_numberのランクが同じではないためです。トピック3を取得し、同じ訪問数のデータが表示された場合は、すべて保持する必要があります~~
select shop,user_id,ct,rank() over(partition by shop order by ct) rk
from t1;t2
計算結果:
ステップ3:各ストアの上位3つのデータを取得します
ステップ2の結果で、各店舗の上位3つのデータを取得するのは簡単ではないでしょうか〜
select shop,user_id,ct
from t2
where rk<=3;
計算結果:
完全なSQL
さて、結果が照会され、上記のステップのSQLがここに統合されました〜
select
shop,
user_id,
ct
from
(select
shop,
user_id,
ct,
rank() over(partition by shop order by ct) rk
from
(select
shop,
user_id,
count(*) ct
from visit
group by
shop,
user_id)t1
)t2
where rk<=3;
結論
私たちが本を読んでいるか質問を書いているかにかかわらず、それは数にあるのではなく、「正確さ」を要求しなければなりません。これには、私たちが考えることを学び、類推によって学ぶことを学ぶ必要があります。本当に問題を解決する能力を持っている人は、多くの問題に時間を費やしてはいけないと思いますが、さまざまな種類の演習をタイムリーに要約して確認する方法を知っている人です。
上記の3つのSQL「小皿料理」はすべての人を満足させるわけではありません。将来、他のいくつかのトピックを要約する機会があります。この記事はここで終了します。技術の世界に興味があり、この記事が好きな友達は、QRコードをスキャンして、作者の元の公開アカウント[Ape Man Fungus]をフォローできます。次号でお会いしましょう!