给定一个任务、人员和时间表,我希望能够看到在每个任务上花费最多时间的人,他们在该任务上花费了多少时间,以及下面的摘要行。
示例表:
task person time
---- ------ ----
Admin Sue 0.5
Admin Ted 0.25
Meetings Ted 1.25
Meetings Sue 0.75
预期结果:
task top_person
---- ----------
Admin Sue (0.5)
Meetings Ted (1.25)
Overall Ted (1.5)
因此,我们可以看到每个任务的排名最高的人,以及排名最高的人在所有任务中的总时间总和。
我目前掌握的情况:
SELECT
DECODE(GROUPING(task), 0, task, 'Overall') AS task,
MAX(person || ' (' || time || ')') KEEP (DENSE_RANK FIRST ORDER BY time DESC) AS top_person
FROM time_table
GROUP BY ROLLUP(task)
输出:
task top_person
---- ----------
Admin Sue (0.5)
Meetings Ted (1.25)
Overall Ted (1.25)
此查询按任务对表进行分组,按时间对组中的任务进行排名,保留第一行,然后显示保留的行中的人员及其时间。除了汇总行外,此查询效果良好,似乎此行对各个任务组执行相同的逻辑,但对所有任务除外。我需要的是按人员分组的所有任务的时间总和,按小时排序,但只适用于汇总行,而不是其他行。有什么想法,我怎么能做到这一点?
3条答案
按热度按时间e0bqpujr1#
虽然Model子句工作得非常好,但如果您想要更多SQL特定的解决方案,您可以尝试-
Demo.
zzlelutf2#
也许你可以考虑使用MODEL子句来处理这类查询。它对于行/列间的操作非常方便。
样本数据:
问题中询问的SQL结果:
更改MODEL子句的RULES部分可以为您提供可能需要或希望从数据中获取的任何其他内容:
omtl5h9j3#
建议:编写{1}一个查询,查询所需结果集的“详细信息”部分;编写{2}另一个查询,查询结果集的“总体”部分,并使用UNION组合这两个部分。VIEW将有助于轻松使用查询。
表格和数据
查询1(详情)
查询2(整体)
现在我们有了2个包含“排名”行的子集,我们只需要编写WHERE子句来过滤结果(仅返回rank_ equals 1的行)。将包含硬编码的“section”值的列添加到查询是有利的,这样我们就可以可靠地对查询的结果集进行排序。(注意查询1和查询2都是VIEW的一部分。以上部分只是说明了视图的内部工作原理。)
查看
一旦视图就位,只需编写一个简单的查询,并应用最终结果的所有格式和顺序。
查询&收尾
Link to DBfiddle .