可能的sybase / ansi transact sql查询这些要求

时间:2013-04-18 23:13:08

标签: sql tsql sybase

我正在试图找出针对以下问题的交易sql(对于sybase),这是我的问题。鉴于以下表格和数据:

表:bank_rating

| bank_name | agency   |
| BankA     | Marvel   |
| BankA     | Sullivan |
| BankA     | Fargo    |
| BankB     | Marvel   |
| BankB     | Fargo    |

表:agency_rating

| agency | rating |
| Marvel | 1      |
| Short  | 1      |
| Fargo  | 2      |

我需要做以下事情。

使用数据填充新表格(示例如下):

表:results_table

| bank_name | agency |
| BankA     | Marvel |

这样:

  • 我总是选择评级最低的代理商。
  • 如果两个代理商具有相同的评级,则按字母顺序选择第一个代理商。

我正在努力解决的问题是如何选择评级最低的代理商,但如果评级相同,则按字母顺序选择第一个。

给定sybase的目标数据库,这个问题的transact sql是什么?

非常感谢您的帮助。

感谢。

1 个答案:

答案 0 :(得分:1)

试试这个:

Select * from
(
  select b.bank_name, a.agency,
  rank() over (partition by b.bank_name order by a.rating, b.agency) rnk
  from bank_rating b
  inner join agency_rating a on b.agency = a.agency
)
where rnk = 1

要创建新表,您可以

Select bank_name, agency into result_table from
(
  select b.bank_name, a.agency,
  rank() over (partition by b.bank_name order by a.rating, b.agency) rnk
  from bank_rating b
  inner join agency_rating a on b.agency = a.agency
)
where rnk = 1

插入现有表格

insert into result_table(bank_name, agency)
Select bank_name, agency from
(
  select b.bank_name, a.agency,
  rank() over (partition by b.bank_name order by a.rating, b.agency) rnk
  from bank_rating b
  inner join agency_rating a on b.agency = a.agency
)
where rnk = 1

不使用窗口函数:

select bank_name, a.agency
from bank_rating b
outer apply (select top 1 y.agency
             from  bank_rating y
             inner join agency_rating x on y.agency = x.agency
             where y.bank_name = b.bank_name
             order by x.rating, x.agency) a