版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
-- 求问题的回答率
-- 回答率 = 回答数/显示数 即ratio = answer/show
USE master
GO
IF EXISTS(SELECT * FROM master.dbo.sysdatabases WHERE name='LeetCode')
BEGIN
DROP DATABASE LeetCode
SELECT 1
END
GO
CREATE DATABASE LeetCode
GO
USE LeetCode
GO
--IF EXISTS(SELECT * FROM sysobjects WHERE name='survey_log')
IF (OBJECT_ID('survey_log', 'U') IS NOT Null)
DROP TABLE survey_log
GO
CREATE TABLE survey_log
(
Id INT IDENTITY
CONSTRAINT PK_surveyLog PRIMARY KEY,
uid INT,
action VARCHAR(20)
CONSTRAINT Check_action
CHECK(action IN ('show', 'skip', 'answer')),
--CHECK(action='show' or action='answer' or action='skip'),
--action VARCHAR(20),
--CONSTRAINT Check_action CHECK(action in ('show', 'answer', 'skip')),
question_id INT,
answer_id INT,
q_num INT,
timestamp INT,
date DATETIME
CONSTRAINT Default_date DEFAULT GETDATE()
)
GO
INSERT INTO survey_log(uid, action, question_id, answer_id, q_num, timestamp)
VALUES
(5, 'show', 285, null, 1, 123),
(5, 'answer', 285, 124124, 1, 124),
(5, 'answer', 369, null, 2, 125),
(5, 'skip', 369, 1, 2, 126)
GO
SELECT *
FROM survey_log
-- 回答率 = 回答数/显示数 即ratio = answer/show
-- S1
-- 分别计算回答数 & 显示数
SELECT question_id,
SUM(CASE
WHEN action='answer' THEN 1
ELSE 0
END) AS num_ans,
SUM(CASE
WHEN action='show' THEN 1
ELSE 0
END) AS num_show
FROM survey_log
GROUP BY question_id
-- 计算 回答率
SELECT N.question_id,
N.num_ans/nullif(N.num_show, 0)
FROM
(
SELECT question_id,
SUM(CASE
WHEN action='answer' THEN 1
ELSE 0
END) AS num_ans,
SUM(CASE
WHEN action='show' THEN 1
ELSE 0
END) AS num_show
FROM survey_log
GROUP BY question_id
) N
SELECT N.question_id
FROM
(
SELECT question_id,
SUM(CASE
WHEN action='answer' THEN 1
ELSE 0
END) AS num_ans,
SUM(CASE
WHEN action='show' THEN 1
ELSE 0
END) AS num_show
FROM survey_log
GROUP BY question_id
) N
ORDER BY (N.num_ans/nullif(N.num_show, 0)) DESC
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
-- S2
SELECT question_id
FROM
(
SELECT q.question_id,
ans.cnt_ans,
s.cnt_show,
DENSE_RANK() OVER
(
ORDER BY
CONVERT(decimal(5,2),
ISNULL(ans.cnt_ans,0)
/
--CASE
--WHEN s.cnt_show=0 THEN NULL
--ELSE s.cnt_show
--END
-- 等价 NULLIF(s.cnt_show, 0)
NULLIF(s.cnt_show, 0)
) DESC
) AS 'Rank'--'Ratio'
FROM
(
SELECT DISTINCT question_id
FROM survey_log
) q
LEFT JOIN
(
SELECT question_id, COUNT(*) AS 'cnt_ans'
FROM survey_log
WHERE action='answer'
GROUP BY question_id
) ans
ON q.question_id=ans.question_id
LEFT JOIN
(
-- 2. 显示数 show
SELECT question_id, COUNT(*) AS 'cnt_show'
FROM survey_log
WHERE action IN ('show')
GROUP BY question_id
) s
ON q.question_id=s.question_id
) R
WHERE R.Rank=1