Sql 根据列中不同值的数量筛选oracle中的行
您好,我在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张账单 您可以使用Sql 根据列中不同值的数量筛选oracle中的行,sql,oracle,Sql,Oracle,您好,我在oracle中有一个表: + -----+----------+----------+-----------+ | ACC | TYPE | BILL_NUM | TYPE_COST | + -----+----------+----------+-----------+ | ACC1 | VOICE | 1 | 10 | | ACC1 | MMS | 1 | 5 | | ACC1 | VOICE
行编号()
:
:
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