Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 子查询解决方案中可能存在的“限制n/选择顶部n”限制_Sql_Sap Iq - Fatal编程技术网

Sql 子查询解决方案中可能存在的“限制n/选择顶部n”限制

Sql 子查询解决方案中可能存在的“限制n/选择顶部n”限制,sql,sap-iq,Sql,Sap Iq,我有下面的例子,我演示的例子是在一个虚拟域上,因为NDA等原因 我可以访问包含以下形状的学生数据的生产数据库: Student_ID Course_Name Total_Average_Grade 1 Maths 19,1 1 Physics 0 1 Biology 0 2 Physics 18,5 2 Chemistry 0 3 Ma

我有下面的例子,我演示的例子是在一个虚拟域上,因为NDA等原因

我可以访问包含以下形状的学生数据的生产数据库:

Student_ID  Course_Name Total_Average_Grade
1           Maths       19,1
1           Physics     0
1           Biology     0
2           Physics     18,5
2           Chemistry   0
3           Maths       19,4
3           Literature  0
3           Physics     0
我想检索总平均成绩最高的10名学生,并检索他们所修课程的完整列表。我想每月运行一次此查询

例如,在上表中,如果我想选择前2名学生,则输出为:

Student_ID  Course_Name Total_Average_Grade
3           Maths       19,4
3           Physics     0
3           Biology     0
1           Maths       19,1
1           Literature  0
1           Physics     0
请注意,我无权在此数据库上创建视图或存储过程,这将是克服无法对select top n/limit n选择执行子查询的限制的一种简单方法,例如,我将能够自动创建一个月视图,我将使用它来加入一个简单的选择前10名平均值等

在这个任务上有什么优雅的解决方案吗


作为记录,我使用Sybase 15.4作为客户端来访问Sybase IQ生产数据库。

我认为您可以使用如下查询:

select *
from (
    select *,
        row_number() over (partition by Course_Name order by Total_Average_Grade desc) as rn
    from yourTable) t
where t < 11;

检查以下在SQL Server上成功运行的查询

        DECLARE @student TABLE(
                Student_ID INT,        
                Course_Name VARCHAR(100),
                Total_Average_Grade VARCHAR(100)
        )

        INSERT INTO @student 
        select 1, 'Maths  '     ,'19.1' union
        select 1, 'Physics'     ,'0'union
        select 1, 'Biology'     ,'0'union
        select 2, 'Physics'     ,'18.5'union
        select 2, 'Chemistry'   ,'0'union
        select 3, 'Maths'       ,'19.4'union
        select 3, 'Literature'  ,'0'union
        select 3, 'Physics'     ,'0'


        ;WITH ValList AS(
                SELECT  Student_ID,Course_Name, Case when Total_Average_Grade like '%,%' then

                        CAST(LEFT(Total_Average_Grade,PATINDEX('%,%', Total_Average_Grade) - 1) AS float) 
                        else Total_Average_Grade end as
                        Total_Average_Grade,
                        RIGHT(Total_Average_Grade,LEN(Total_Average_Grade) - PATINDEX('%,%', Total_Average_Grade)) Remainder

                FROM    @student
                UNION ALL
                SELECT  Student_ID,Course_Name,
                        CAST(LEFT(Remainder,CASE WHEN PATINDEX('%,%', Remainder) = 0 THEN LEN(Remainder) ELSE PATINDEX('%,%', Remainder) - 1 END) AS float) Total_Average_Grade,
                        RIGHT(Remainder,CASE WHEN PATINDEX('%,%', Remainder) = 0 THEN 0 ELSE LEN(Remainder) - PATINDEX('%,%', Remainder) END) Remainder
                FROM    ValList
                WHERE   LEN(Remainder) > 0

        )


        select SS.* from @student SS  
        join 
        (
        SELECT  top 2 v.Student_ID  --  use TOP 10 for 10 records
        --,s.Course_Name,s.Total_Average_Grade,SUM(v.Total_Average_Grade) as Avg,
        ,row_number() over( order by SUM(v.Total_Average_Grade) desc) rnk
        FROM    ValList V
        join @student S on s.Student_ID=V.Student_ID and s.Course_Name=V.Course_Name
        GROUP BY v.Student_ID
        )AA on AA.Student_ID=SS.Student_ID
        order by rnk asc,Total_Average_Grade desc
输出:


为输入表添加样本输出检查输出plz。学生1得到19,4分?但在输入表中,它的19,1?修复了由于复制粘贴而导致的错误:在输出表中,数学19,1?你能描述一下吗。总数是20。小于studentid 2和3。所有课程的总平均值存储在每个学生的第一行。因此,19.1、19.4等是所有课程的平均值,但在每一行对每个学生重复注释,但仅保存在第一行。每节课的分数都是未知的和不相关的。这两种方法都有效,但第一种方法要优雅得多。我对分析SQL函数和逻辑有点陌生,在使用分析函数时,这项任务和类似任务似乎比想象的要容易得多。