Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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行_Sql_Ms Access - Fatal编程技术网

Sql 为每个组选择前N行

Sql 为每个组选择前N行,sql,ms-access,Sql,Ms Access,我有以下MS Access DB模式: 我想从Items表中选择按Items.score排序的行,以便每个组最多有Group.top\u计数行 例如,表中有以下数据: 分组表: 项目表: 我想为组1选择前2项,为组2选择前1项。因此,结果必须包含第1、2和5行 有一个关于SQL Server的问题。因此,所有答案都使用SQL Server语法,我无法将其应用于MS Access。如果每个组有一个固定的数字,您可以执行以下操作: select i.* from items as i inner j

我有以下MS Access DB模式:

我想从Items表中选择按Items.score排序的行,以便每个组最多有Group.top\u计数行

例如,表中有以下数据:

分组表:

项目表:

我想为组1选择前2项,为组2选择前1项。因此,结果必须包含第1、2和5行


有一个关于SQL Server的问题。因此,所有答案都使用SQL Server语法,我无法将其应用于MS Access。

如果每个组有一个固定的数字,您可以执行以下操作:

select i.*
from items as i inner join
     groups as g
     on i.group_id = g.id
where i.id in (select top 2 i2.id
               from items i2
               where i2.group_id = i.group_id
               order by i2.score desc
              );
相反,您需要枚举这些值,这在MS Access中非常昂贵:

select i.*
from (select i.*,
             (select count(*)
              from items i2
              where i2.group_id = i.group_id and
                    (i2.score < i.score or
                     i2.score = i.score and i2.id <= i2.id
                    )
             ) as seqnum
      from items as i
     ) as i inner join
     groups as g
     on i.group_id = g.id
where i.seqnum <= g.top_count;

此逻辑实现了与row_number等效的功能,如果您的数据库支持此功能,这是解决此问题的正确方法。

使用VBA创建SQL命令,或许可以尝试此未经测试的方法。它基本上创建了一个联接每个分组的联合,并允许您在任何大小的表上运行它,但不确定联合是否有限制,以及在多次之后是否开始停滞,或者可能有更好的方法,您可以打开一个记录集/表,只将结果写入该记录集/表,而不必执行联合操作

SET DBS = CURRENTDB    
strSQL = ""
intMax = dmax("ID", "group")

FOR i = 1 TO intMax
    strSQL = strSQL & "SELECT TOP " & DLOOKUP("top_count","group","ID = " & I) & " ID " & _
        "FROM items WHERE group_id = " & i & " ORDER BY score "

    if i < intMax
        strSQL = strSQL & " UNION "
    endif
next i

dbs.execute strSQL