如果列值相同,如何对SQL值进行分组

时间:2017-07-08 11:32:50

标签: sql sql-server

需要SQL的帮助,尝试了一段时间,仍然无法弄明白

我创建表

CREATE TABLE Data
(
    Sender              VARCHAR(255),
    Receiver            VARCHAR(255),
    MSG                 VARCHAR(255),
);

插入值后

SEND1   REC1    Hey whats up
SEND1   REC2    Yoo how are you
SEND1   REC1    Nothing much

我一直试图做的是

Select * FROM DATA WHERE Sender = 'SEND1'

但是,我只是想显示第二行和第三行,基本上如果SENDER和RECEIVER与前一行相同,则忽略前一行并仅取最后一行并且不重复相同的SENDER和RECEIVER < / p>

由于

我正在使用SQL-SERVER

我的意思是始终采取相同的发送者的最后一行&#39;和&#39; Receiver&#39;,第一行和第三行有相同的发送者和接收者,所以当我选择语句时,我只想要最后一行

4 个答案:

答案 0 :(得分:1)

正如您在评论中建议的那样,您可以通过这种方式添加整数自动增量列 Num

CREATE TABLE Data
(
Num integer IDENTITY(1,1),
Sender              VARCHAR(255),
Receiver            VARCHAR(255),
MSG                 VARCHAR(255),
);

因此,最新消息的编号最高。然后添加值:

insert into Data values ('SEND1','REC1','Hey whats up')

insert into Data values ('SEND1','REC2','Yoo how are you')

insert into Data values ('SEND1','REC1','Nothing much')

最后,您应该尝试运行此查询:

select * from Data
where Num in (
  select max(Num) from Data 
      group by Sender, Receiver)

答案 1 :(得分:1)

根据相关评论,考虑您有一个标识列来查找记录的顺序。使用ROW_NUMBER窗口功能查找最新的Sender/Receiver消息。

Select * from
(
Select Row_Number()Over(Partition by Sender,Receiver order by Num desc) Rn,*
From yourtable
) A
Where Rn = 1

答案 2 :(得分:0)

您可以尝试使用OFFSET子句来偏移(跳过)第一条消息。

SELECT * FROM Data WHERE Sender = 'SEND1' OFFSET 1;

麻烦的是你需要一个id列或一个日期时间戳到ORDER BY,这样你就可以保证不包括发送的第一条消息。

e.g。

SELECT 
* 
FROM Data
WHERE Sender = 'SEND1' 
ORDER BY id -- or a datetime column
LIMIT 1000 OFFSET 1;

我不太明白:

  

基本上如果SENDER和RECEIVER与前一行相同,则忽略前一行并仅取最后一行,不再复制相同的SENDER和RECEIVER

但这应该包括案例:

  

我只想展示第二行和第三行

答案 3 :(得分:-1)

假设您有唯一/ PK id列,更高的值意味着最新记录。然后你可以使用:

select DATA.* from DATA 
join(
    select max(id) as maxid 
    from DATA 
    group by Sender, Receiver 
)t
on DATA.id = t.maxid