当前位置: 首页 > 知识库问答 >
问题:

如何根据不同列选择整行

姬俊能
2023-03-14

我在火花中这样做

cityId  PhysicalAddress      EmailAddress         ..many other columns of other meta info...   
1       b st                 something@email.com   
1       b st                 something@email.com   <- some rows can be entirely duplicates
1       a avenue             random@gmail.com
2       c square             anything@yahoo.com
2       d blvd               d@d.com

这张表上没有主键,我想根据每个不同的cityId随机获取一行

例如,这是一个正确的答案

cityId  PhysicalAddress      EmailAddress        ..many other columns 
1       b st                 something@email.com   
2       c square             anything@yahoo.com

例如,这也是一个正确的答案

cityId  PhysicalAddress      EmailAddress       ..many other columns 
1       a avenue             random@gmail.com
2       c square             anything@yahoo.com

想到的一种方法是使用< code>group by。然而,这要求我在另一列上使用聚合函数。(比如min())。然而,我只想拉出一整行(不管是哪一行)。

共有2个答案

沃侯林
2023-03-14

我有Sql Server 2008 R2,但试图找到可以在其他DBMS上运行的方法。

create table contacts( cityId int, PhysicalAddress varchar(max), EmailAddress varchar(max) )

delete contacts
insert contacts( cityId, PhysicalAddress, EmailAddress )    /** ..many other columns of other meta info...  */  
values 
   ( 1, 'b st', 'something@email.com' )  
 , ( 1, 'b st', 'something@email.com' )                     /* some rows can be entirely duplicates */
 , ( 1, 'a avenue', 'random@gmail.com' )
 , ( 2, 'c square', 'anything@yahoo.com' )
 , ( 2, 'd blvd', 'd@d.com' )
 , ( 3, 'e circuit', 'e@e.com' )

-- using row_number()

with c as (
      select *, row_number() over (partition by cityId order by cityId) as seqnum
      from contacts
     )
    select * from c
    where seqnum = 1;


-- Add a new identity column

alter table contacts
    add id int identity(1,1)

select * from contacts where id in (select min(id) from contacts group by cityID)

-- Variation: Create a copy into a temp table and add an identity column
-- Note: It may not be possible to modify original table

select * into #contacts from contacts
alter table #contacts
    add id int identity(1,1)
select * from #contacts where id in (select min(id) from #contacts group by cityID)

我还尝试使用newid()使用计算列,但我的兴奋是短暂的,因为当您将表连接到自身或在该表上使用子查询时,会为每个SELECT重新计算计算列,所以这不起作用。您不能使计算列<code>PERSISTED</code>-这对于非确定性表达式(如<code>newid()</code>)是不允许的,因为它每次在给定行上调用时都会返回不同的内容。

张晔
2023-03-14
;WITH CTE AS
(
   SELECT *, ROW_NUMBER() OVER(PARTITION BY cityId ORDER BY cityId) AS RN
   FROM [TABLE_NAME]
) SELECT * FROM CTE WHERE RN = 1
 类似资料:
  • 问题内容: 我有一个名为@status的变量,该变量在此select语句之前设置: 我只想选择if列,否则我想为shipwith选择null。我该如何完成? 问题答案:

  • 考虑一个案例类: 和一个 包含该类的许多实例。 唯一键是元组。然而,我们确实有一些副本。 是否有任何有效的方法来删除重复项? 手术 将查找重复的整行。 回退将涉及将唯一的组合连接回整个行:我正在研究如何做到这一点。但即便如此,还是有几次手术。更简单的方法(也更快?)如果它存在的话会很有用。

  • 我有以下表在PostgreSQL 11. 我想得到具有col1,col2,col3和col4的不同值的行,如果col1,col2,col3相同,则取col1的第一个值。 期望的输出是: 我试着回答以下问题。 如何将输出限制为每col2,col3.获得一个col1值。。例如,选择col1值:3876,不包括3924。

  • 如何根据Pandas中某个列中的值从中选择行? 在SQL中,我将使用: 我试图查看熊猫的文档,但我没有立即找到答案。

  • 我试图查看熊猫的文档,但我没有立即找到答案。

  • 我有一个表,它有4列()gender具有与每个客户链接的唯一值:、或。 该部门与每种产品(男性或女性)都有独特的价值 我做了一个复杂的过程。首先,使用客户信息将male和其他客户分开(创建了两个表CUST_MALEY和cust_other) 如果CUST_MALEY表中有客户,则使用join,返回men division products行(其中division='men');如果cust_oth