Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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 根据列中不同值的数量筛选oracle中的行_Sql_Oracle - Fatal编程技术网

Sql 根据列中不同值的数量筛选oracle中的行

Sql 根据列中不同值的数量筛选oracle中的行,sql,oracle,Sql,Oracle,您好,我在oracle中有一个表: + -----+----------+----------+-----------+ | ACC | TYPE | BILL_NUM | TYPE_COST | + -----+----------+----------+-----------+ | ACC1 | VOICE | 1 | 10 | | ACC1 | MMS | 1 | 5 | | ACC1 | VOICE

您好,我在oracle中有一个表:

+ -----+----------+----------+-----------+ | ACC | TYPE | BILL_NUM | TYPE_COST | + -----+----------+----------+-----------+ | ACC1 | VOICE | 1 | 10 | | ACC1 | MMS | 1 | 5 | | ACC1 | VOICE | 2 | 20 | | ACC1 | MMS | 2 | 15 | | ACC1 | VOICE | 3 | 30 | | ACC2 | VOICE | 1 | 3 | | ACC2 | MMS | 1 | 4 | | ACC2 | MMS | 2 | 14 | | ACC2 | MMS | 3 | 24 | | ACC2 | MMS | 4 | 34 | + -----+----------+----------+-----------+ 我想过滤掉行,只需要看到每个帐户最近的2张账单

您可以使用
行编号()

ACC | TYPE | BILL_NUM | TYPE_COST :--- | :---- | -------: | --------: ACC1 | VOICE | 3 | 30 ACC1 | VOICE | 2 | 20 ACC2 | MMS | 4 | 34 ACC2 | MMS | 3 | 24 ACC | TYPE | BILL_NUM | TYPE_COST :--- | :---- | -------: | --------: ACC1 | VOICE | 3 | 30 ACC1 | VOICE | 2 | 20 ACC1 | MMS | 2 | 15 ACC2 | MMS | 4 | 34 ACC2 | MMS | 3 | 24 ACC |类型|账单|数量|类型|成本 :--- | :---- | -------: | --------: ACC1 |语音| 3 | 30 ACC1 |语音| 2 | 20 ACC1 | MMS | 2 | 15 ACC2 | MMS | 4 | 34 ACC2 | MMS | 3 | 24
它是如何筛选出1个有效行的ACC1@Vijay:此查询为每个
acc
bill_num
,提供两条最新记录-对于类型为MMS的ACC1,还有一行具有相同的bill num。您可以检查我提到的查询的输出,在那里可以找到有效的行。使用
densite\u RANK
而不是
ROW\u NUMBER
来获取每个帐户两张账单的所有行。@ThorstenKettner:谢谢,我想这是OP实际想要的,考虑到上面的评论。我编辑了我的答案。
select *
from (  
    select t.*, row_number() over(partition by acc order by bill_num desc) rn
    from mytable t
) t
where rn <= 2
ACC | TYPE | BILL_NUM | TYPE_COST :--- | :---- | -------: | --------: ACC1 | VOICE | 3 | 30 ACC1 | VOICE | 2 | 20 ACC2 | MMS | 4 | 34 ACC2 | MMS | 3 | 24
select *
from (  
    select t.*, dense_rank() over(partition by acc order by bill_num desc) rn
    from mytable t
) t
where rn <= 2
ACC | TYPE | BILL_NUM | TYPE_COST :--- | :---- | -------: | --------: ACC1 | VOICE | 3 | 30 ACC1 | VOICE | 2 | 20 ACC1 | MMS | 2 | 15 ACC2 | MMS | 4 | 34 ACC2 | MMS | 3 | 24