需要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;,第一行和第三行有相同的发送者和接收者,所以当我选择语句时,我只想要最后一行
答案 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