広告レイヤーデータは、多くの場合、大画面ディスプレイまたはリアルタイムストリーム処理で使用される最終結果インジケーターデータです。次の2つの例を使用して、ビジネス大画面ディスプレイSQLの記述方法を練習してください。
1.会員分析事例
1.1データの準備
テーブルの構造は次のとおりです。このテーブルは、毎日のメンバー情報の要約など、ディメンションとして日を含むdwsレイヤーのメンバーテーブルです。
use dws;
drop table if exists dws.dws_member_start_day;
create table dws.dws_member_start_day(
`device_id` string, -- 设备id,来区分用户
`uid` string, -- uid
`app_v` string,
`os_type` string,
`language` string,
`channel` string,
`area` string,
`brand` string
) COMMENT '会员日启动汇总'
partitioned by(dt string)
stored as parquet;
1.2メンバーインデックスの計算
サイレントメンバーの定義:アプリはインストール日にのみ起動され、インストール時間は7日前です。
失われたメンバーの定義:過去30日間にログインしていないメンバー
1.2.1サイレントメンバーの数を計算する方法
-- 拿到只启动一次的会员,后面再过滤安装时间是再7天前的,使用sum 窗口函数
SELECT count(*)
FROM
(SELECT device_id,
sum(device_id) OVER (PARTITION BY device_id) AS sum_num,
dt
FROM dws.dws_member_start_day) tmp
WHERE dt <= date_add(CURRENT_DATE, -7)
AND sum_num=1
1.2.2失われたメンバーの数を計算する方法
-- 拿到会员最近一次登录时间,并用row_number来过滤
SELECT count(*)
FROM
(SELECT device_id,
dt,
row_number() OVER (PARTITION BY device_id
ORDER BY dt DESC) ro
FROM dws.dws_member_start_day) tmp
WHERE ro=1
AND dt >= date_add(CURRENT_DATE, -30)
2.コアトランザクションケース
2.1データの準備
日次注文ディメンションテーブルがある場合、テーブル構造は次のようになります。
DROP TABLE IF EXISTS dwd.dwd_trade_orders;
create table dwd.dwd_trade_orders(
`orderId` int,
`orderNo` string,
`userId` bigint,
`status` tinyint,
`productMoney` decimal,
`totalMoney` decimal,
`payMethod` tinyint,
`isPay` tinyint,
`areaId` int,
`tradeSrc` tinyint,
`tradeType` int,
`isRefund` tinyint,
`dataFlag` tinyint,
`createTime` string,
`payTime` string,
`modifiedTime` string,
`start_date` string,
`end_date` string
) COMMENT '订单事实拉链表'
partitioned by (dt string)
STORED AS PARQUET;
その中で、注文ステータス-3ユーザーが拒否-2未払いの注文-1ユーザーがキャンセル0配達待ち1配達中2ユーザーが受領を確認、注文有効フラグ-1削除1有効
詳細ファクトジッパーテーブルを処理する場合、データの前処理は便利ではありません。中間テーブルを作成できます。dws_trade_orders_day
テーブルの構造と処理は次のとおりです。
DROP TABLE IF EXISTS dws.dws_trade_orders_day;
CREATE TABLE IF NOT EXISTS dws.dws_trade_orders_day(day_dt string COMMENT '日期:yyyy-MM-dd',
day_cnt decimal commnet '日订单笔数',
day_sum decimal COMMENT '日订单总额') COMMENT '日订单统计表';
SELECT dt,
count(*) cnt,
sum(totalMoney) sm
FROM
(SELECT DISTINCT orderid,
dt,
totalMoney
FROM dwd.dwd_trade_orders
WHERE status >= 0
AND dataFlag = '1') tmp
GROUP BY dt;
INSERT OVERWRITE TABLE dws.dws_trade_orders_day
SELECT dt,
count(*) cnt,
sum(totalMoney) sm
FROM
(SELECT DISTINCT orderid,
dt,
totalMoney
FROM dwd.dwd_trade_orders
WHERE status >= 0
AND dataFlag = '1') tmp
GROUP BY dt;
SELECT *
FROM dws.dws_trade_orders_day
WHERE day_dt BETWEEN '2020-01-01' AND '2020-12-31';
2.2指標1。2020年の各四半期の販売注文数と合計注文数を数えます
まず、広告インジケーターテーブルを作成します。dws_trade_orders_quarter
DROP TABLE IF EXISTS dws.dws_trade_orders_quarter;
CREATE TABLE IF NOT EXISTS dws.dws_trade_orders_quarter(YEAR string COMMENT '年份',
QUARTER string COMMENT '季度',
cnt decimal COMMENT '订单总笔数',
SUM decimal COMMENT '订单总额') COMMENT '季度订单统计表';
INSERT OVERWRITE TABLE dws.dws_trade_orders_quarter WITH tmp AS
(SELECT substr(day_dt, 0, 4) YEAR,
CASE WHEN substr(dat_dt, 6, 2)="01"
OR substr(dat_dt, 6, 2)="02"
OR substr(day_dt, 6, 2)="03" THEN "1" WHEN substr(dat_dt, 6, 2)="04"
OR substr(dat_dt, 6, 2)="05"
OR substr(day_dt, 6, 2)="06" THEN "2" WHEN substr(dat_dt, 6, 2)="07"
OR substr(dat_dt, 6, 2)="08"
OR substr(day_dt, 6, 2)="09" THEN "3" WHEN substr(dat_dt, 6, 2)="10"
OR substr(dat_dt, 6, 2)="11"
OR substr(day_dt, 6, 2)="12" THEN "4" AS QUARTER day_cnt,
day_sum
FROM dws.dws_trade_orders_day)
SELECT YEAR,
QUARTER,
sum(day_cnt),
sum(day_sum)
FROM tmp
GROUP BY YEAR QUARTER;
2。32020年の各月の販売注文数と合計注文額をカウントします
まず、広告インジケーターテーブルを作成します。dws_trade_orders_month
DROP TABLE IF EXISTS dws.dws_trade_orders_month;
CREATE TABLE IF NOT EXISTS dws.dws_trade_orders_month(yearstring COMMENT '年份',
MONTH string COMMENT '月份',
month_cnt decimal COMMENT '月订单总笔数',
month_sum decimal COMMENT '月订单总额') COMMENT '月订单统计表';
INSERT OVERWRITE TABLE dws.dws_trade_orders_month WITH tmp AS
(SELECT substr(day_dt, 0, 4) YEAR,
sunstr(day_dt, 6, 2) MONTH,
day_cnt,
day_sum
FROM dws.dws_trade_orders_day)
SELECT YEAR,
MONTH,
sum(day_cnt) month_cnt,
sum(day_sum) month_sum
FROM tmp
GROUP BY YEAR,
MONTH;
2.4 2020年の1週間(月曜日から日曜日)の販売注文数と合計注文額をカウントします
広告レイヤーインジケーターテーブルを作成します。dws_trade_orders_week
日付関数を使用しますweekofyear
DROP TABLE IF EXISTS dws.dws_trade_orders_week;
CREATE TABLE IF NOT EXISTS dws.dws_trade_orders_week(YEAR string COMMENT '年份',
WEEK string COMMENT '一年中的第几周',
week_cnt decimal COMMENT '周订单总笔数',
week_sum decimal COMMENT '周订单总额') COMMENT '周订单统计表';
INSERT OVERWRITE TABLE dws.dws_trade_orders_week
SELECT substr(day_dt, 0, 4) YEAR,
weekofyear(day_dt) WEEK,
sum(day_cnt),
sum(day_sum)
FROM dws.dws_trade_orders_day
GROUP BY substr(day_dt, 0, 4) YEAR,
weekofyear(day_dt) WEEK;
2.5 2020年の国民の法定休日、休憩日、および営業日の注文数と合計注文数をカウントします。
日付情報ディメンションテーブルを作成しdim_day_info
、休日情報データを入力します(データは毎年異なり、州議会からの発表が必要なため、手動で定期的に管理されます)
drop table if exists dim.dim_day_info;
create table if not exists dim.dim_day_info(
day_dt string comment '日期',
is_holidays int comment '节假日标识: 0不是 1是',
is_workday int comment '工作日标识 0不是 1是'
) comment '日期信息表';
-- 统计2020节假日的订单笔数,订单总额
SELECT nvl(sum(day_cnt), 0) nvl(sum(day_sum), 0)
FROM dws.dws_trade_orders_day A
LEFT JOIN dim.dim_day_info B ON A.day_dt = B.day_dt
WHERE B.is_holiday = 1;
-- 统计2020年休息日的订单笔数,订单总额
SELECT nvl(sum(day_cnt), 0) nvl(sum(day_sum), 0)
FROM dws.dws_trade_orders_day A
LEFT JOIN dim.dim_day_info B ON A.day_dt = B.day_dt
WHERE B.is_workday = 0;
-- 统计2020节工作日的订单笔数,订单总额
SELECT nvl(sum(day_cnt), 0) nvl(sum(day_sum), 0)
FROM dws.dws_trade_orders_day A
LEFT JOIN dim.dim_day_info B ON A.day_dt = B.day_dt
WHERE B.is_workday = 1;
Wu Xie、Xiao San Ye、バックグラウンドの小さな新人、ビッグデータ、人工知能。もっと注意してください