我正在尝试从PGExercises.com解决这个特殊问题:
https://www.pgexercises.com/questions/aggregates/rankmembers.html
问题的要点是我给了一张他们预订的俱乐部会员和半小时时间表(获得列表是两个表的简单INNER JOIN).
我应该按照预订的总时数产生一个递减的会员排名,四舍五入到最接近的10.我还需要使用RANK()窗口函数生成具有等级的列,并按等级对结果进行排序.(结果产生30条记录.)
作者非常优雅的解决方案是这样的:
select firstname, surname, hours, rank() over (order by hours) from
(select firstname, surname,
((sum(bks.slots)+5)/20)*10 as hours
from cd.bookings bks
inner join cd.members mems
on bks.memid = mems.memid
group by mems.memid
) as subq
order by rank, surname, firstname;
Run Code Online (Sandbox Code Playgroud)
不幸的是,作为一个SQL新手,我非常不优雅的解决方案更复杂,使用CASE WHEN和转换数字到文本,以查看最后一个数字,以决定是向上舍入还是向下舍入:
SELECT
firstname,
surname,
CASE
WHEN (SUBSTRING(ROUND(SUM(slots*0.5),0)::text from '.{1}$') IN ('5','6','7','8','9','0')) THEN CEIL(SUM(slots*0.5) /10) * 10
ELSE FLOOR(SUM(slots*0.5) /10) * 10 …Run Code Online (Sandbox Code Playgroud) 我有一个数据框,其中一个变量(称为Q1)具有多个级别:“不使用”,“ 30分钟”,“ 1小时”,“ 2小时”,“ 3小时以上”。
如何绘制barplot(),其中的条形图按因子水平排序?我尝试使用sort(),但这并不能解决问题。
编辑:根据要求,一些示例数据:
Q1
1 hour
1 hour
30 min
2 hours
3+ hours
3+ hours
3+ hours
3+ hours
2 hours
1 hour
2 hours
1 hour
30 min
Run Code Online (Sandbox Code Playgroud)
我试过了:
barplot(table(sort(Q1)), main = "Q1 Answer Distribution", ylim = c(0, 250), cex.axis=0.9)
Run Code Online (Sandbox Code Playgroud)
但这并不能满足我的需求。