我有一个表格,我可以为这个给定的ID设置多个名称:
a_table(id int,name varchar(100),priority int);
我需要一个会在名称上搜索的语句,但要确保每个ID只返回1个名称,并且该名称将是具有更高优先级的名称。
e.g。如果我的数据是
1, AaaB, 2 1, AbbB, 1 1, AccB, 0 2, foo, 0 3, AddC, 0
我希望我的查询“A%”返回:
1, AaaB 3, AddC
我在想这样的事情:
select * from a_table where name like 'A%' group by id;
但这并不能保证会选择优先级较高的值。
有什么想法吗?
谢谢, 斯塔夫罗斯
答案 0 :(得分:5)
答案 1 :(得分:1)
您必须首先获得每个ID的最高优先级,然后过滤名称:
select t2.id, t2.name, t2.price
from (
select id, max(priority)
from a_table
group by id
) t1,
a_table t2
where t1.id = t2.id
and t1.priority = t2.priority
and t2.name like 'A%'
采用@ niktrs的有效建议,这与上面的查询相同,使用标准JOIN
代替where
来连接表。这比前一个更优先
select t2.id, t2.name, t2.price
from (
select id, max(priority)
from a_table
group by id
) t1 JOIN a_table t2 ON t1.id = t2.id
and t1.priority = t2.priority
and t2.name like 'A%'
答案 2 :(得分:0)
select *
from a_table t
join (
select max(Priority) MaxPriority, Name
from a_table a
where name like 'A%'
group by Name
)x where x.MaxPriority=a.Priority and x.Name=t.Name
基于数据示例中的第一列是“优先级”。
这只是从Alvaro的答案中链接的SQL。
答案 3 :(得分:0)
select id, name
from a_table at
where
name like 'A%' and
priority = (
select max(priority)
from a_table
where (id = at.id) and (name like 'A%')
)
答案 4 :(得分:0)
这会有效吗,
选择不同的id,first_value(name)over(按名称分区的id分区) 来自demo_tab t 其中t.name喜欢'A%'
抱歉pratik, 一定是
选择不同的id,first_value(name)over(按优先级desc的id顺序分区) 来自demo_tab,其名称类似于'A%'