Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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 基于组密度\u秩()值和行数()值时的情况_Sql_Sql Server 2008_Row Number_Case When_Dense Rank - Fatal编程技术网

Sql 基于组密度\u秩()值和行数()值时的情况

Sql 基于组密度\u秩()值和行数()值时的情况,sql,sql-server-2008,row-number,case-when,dense-rank,Sql,Sql Server 2008,Row Number,Case When,Dense Rank,这是一项任务,我被赋予根据我从col1,col2的行数中获得的外部索引组获取数量,col3 以下是规则: 1)在每个外部索引组内,如果col4有4055和4086,我应该得到的数量在内部索引组内4086行,通常在内部索引组中3或2 2-否则,如果col4只有4055,则直接从行中获取数量 结果是这样的 你觉得我会怎么做?当发生时,我正在考虑案例,但我不知道如何处理这种情况 多谢各位 SELECt col1,col2,col3,col4,qty ,dense_rank

这是一项任务,我被赋予根据我从
col1
col2
行数
中获得的
外部索引组
获取
数量,
col3

以下是规则:

1)在每个
外部索引组内
,如果
col4
有4055和4086,我应该得到的
数量
内部索引组内
4086行,通常在
内部索引组中
3或2

2-否则,如果
col4
只有4055,则直接从行中获取数量

结果是这样的

你觉得我会怎么做?当
发生时,我正在考虑
案例,但我不知道如何处理这种情况

多谢各位

    SELECt col1,col2,col3,col4,qty
         ,dense_rank() over (order by col1,col2,col3) as outer_index_group
   , ROW_NUMBER() over (partition by col1,col2,col3 order by col1,col2,col3) as      inner_index_group from table
这里重要的部分是(…,col4 desc)上的Rank()。它将为col1、col2、col3的每个分区中具有最大值的行分配最高秩1。因此,如果分区中有col4=4086的行,它们将得到秩1,其余col4=4055的行得到秩2;如果在某些分区中没有显示这样的行,那么col4=4055的行将在那里得到秩1


如果每个分区只需要一行(rank()可以将rnk=1分配给多行),rank()可以替换为row_number()。

现在有哪个sql查询?
选择col1、col2、col3、col4、qty、densite_rank()over(按col1、col2、col3排序)作为外部索引组,row_number()over(按col1、col2、col3排序,按col1、col2、col3排序)作为表
@ASh中的内部索引组,如何解决这个问题?
select * from
(
    select col1,col2,col3,col4,qty
          ,dense_rank() over (order by col1,col2,col3) as outer_index_group
          ,row_number() over (partition by col1,col2,col3 order by col1,col2,col3) as      inner_index_group
          ,RANK() over (partition by col1,col2,col3 order by col1,col2,col3,col4 desc) as rnk
          from myTable
) T
where rnk = 1