可能 select 只有 1 行用户名,即使包含用户名的多行是唯一的
Possible to select only 1 row for usernames, even though multiple rows which include usernames are unique
我正在尝试 select 所有拥有至少一个 windows 操作系统的用户名。有些用户有很多 windows 个操作系统,但我真的只需要知道他们是否至少有一个。
我知道 DISTINCT
可以过滤掉重复项,但问题是这些行是唯一的,如果它们有多个 OS。例如:
JohnDoe windows 10;
JohnDoe windows 97;
JohnDoe windows 7;
JennyDoe windows 10;
在这种情况下,JohnDoe 将被 selected 3 次,因为他有 3 个独特的操作系统。
有没有办法从本质上说,如果出现此用户名的实例,只有 select 一行?
我假设 username
和 os
- 存储在两个单独的列中。
让我们用一些数据创建 table。
CREATE TABLE IF NOT EXISTS `user_os` ( username varchar(100), os varchar(100));
INSERT INTO user_os values
('JohnDoe', 'windows 10'),
('JohnDoe', 'windows 97'),
('JohnDoe', 'windows 7'),
('JennyDoe', 'windows 10'),
('Jessica', 'Ubuntu');
现在我们可以在 os
列中查找 'windows'
字符串并对其进行分组。您将获得 1
- 对于至少有 1 个 windows 的用户 os 或 0
- 对于其他人。
SELECT username, instr(os, 'windows') AS at_least_1_windows
FROM user_os
GROUP BY 1,2;
结果:
username at_least_1_windows
-------- ------------------
JennyDoe 1
Jessica 0
JohnDoe 1
在 sql 中,您可以使用 Tsql row_number 代码,因此当您只需要 select 时,仅 select 行号为 1 的行许多重复行之间的一行最好使用此代码,因为不同的速度很慢
CREATE TABLE table_name (
usernam varchar(100),
os varchar(100),
)
insert into table_name
values('john','windows10')
insert into table_name
values('john','windows7')
insert into table_name
values('david','windows7')
select
usernam,
row_number() over (partition by [usernam] order by os desc)rownum
from
table_name t
所以结果是
so if you add this query select only one record
select tbl.usernam from (
select
usernam,
row_number() over (partition by [usernam] order by os desc) rownum
from
table_name
) tbl
where rownum=1
所以结果是
您还可以显示其他字段
select tbl.usernam,tbl.os from (
select
usernam,
os,
row_number() over (partition by [usernam] order by os desc) rownum
from
table_name
) tbl
where rownum=1
结果是:
据此你的查询速度很好
最简单的方法是使用DISTINCT
:
select distinct username
from your_table
where operating_system like '%windows%'
根据问题中显示的数据,这将 return
JohnDoe
JennyDoe
我正在尝试 select 所有拥有至少一个 windows 操作系统的用户名。有些用户有很多 windows 个操作系统,但我真的只需要知道他们是否至少有一个。
我知道 DISTINCT
可以过滤掉重复项,但问题是这些行是唯一的,如果它们有多个 OS。例如:
JohnDoe windows 10;
JohnDoe windows 97;
JohnDoe windows 7;
JennyDoe windows 10;
在这种情况下,JohnDoe 将被 selected 3 次,因为他有 3 个独特的操作系统。
有没有办法从本质上说,如果出现此用户名的实例,只有 select 一行?
我假设 username
和 os
- 存储在两个单独的列中。
让我们用一些数据创建 table。
CREATE TABLE IF NOT EXISTS `user_os` ( username varchar(100), os varchar(100));
INSERT INTO user_os values
('JohnDoe', 'windows 10'),
('JohnDoe', 'windows 97'),
('JohnDoe', 'windows 7'),
('JennyDoe', 'windows 10'),
('Jessica', 'Ubuntu');
现在我们可以在 os
列中查找 'windows'
字符串并对其进行分组。您将获得 1
- 对于至少有 1 个 windows 的用户 os 或 0
- 对于其他人。
SELECT username, instr(os, 'windows') AS at_least_1_windows
FROM user_os
GROUP BY 1,2;
结果:
username at_least_1_windows
-------- ------------------
JennyDoe 1
Jessica 0
JohnDoe 1
在 sql 中,您可以使用 Tsql row_number 代码,因此当您只需要 select 时,仅 select 行号为 1 的行许多重复行之间的一行最好使用此代码,因为不同的速度很慢
CREATE TABLE table_name (
usernam varchar(100),
os varchar(100),
)
insert into table_name
values('john','windows10')
insert into table_name
values('john','windows7')
insert into table_name
values('david','windows7')
select
usernam,
row_number() over (partition by [usernam] order by os desc)rownum
from
table_name t
所以结果是
so if you add this query select only one record
select tbl.usernam from (
select
usernam,
row_number() over (partition by [usernam] order by os desc) rownum
from
table_name
) tbl
where rownum=1
所以结果是
您还可以显示其他字段
select tbl.usernam,tbl.os from (
select
usernam,
os,
row_number() over (partition by [usernam] order by os desc) rownum
from
table_name
) tbl
where rownum=1
结果是:
据此你的查询速度很好
最简单的方法是使用DISTINCT
:
select distinct username
from your_table
where operating_system like '%windows%'
根据问题中显示的数据,这将 return
JohnDoe
JennyDoe