SQL选择包含条件的最后记录列表

时间:2014-04-30 21:25:53

标签: sql sql-server

我有下表

ID名称CodSituation
约翰一世1 2玛丽2 3玛丽3
4玛丽4 约翰5章5 约翰二世6 7玛丽1

我想为所有最后一个条目为CodSituation = 2的用户选择名称,ID和CodSituation

在这些结果中,我将得到id 6 As Mary的最后一个条目是CodeSituation = 4 如果有多个用户的最新CodSituation = 2我也想要它们。

3 个答案:

答案 0 :(得分:6)

[最终编辑] 在看到这个答案结尾处发布的内容后,我发现用户提出了错误的问题:

他们问的是“告诉我每个拥有CodSituation = 2的人”,当他们的意思是“向我展示最后一次进入CodSituation领域的用户= 2”

以下是对此的正确查询:

select a.ID, a.Name, a.CodSituation
from table_name a
inner join (
    select Name, max(ID) as MaxID
    from table_name
    group by Name
) b on a.Name = b.Name and a.ID = b.MaxID 
where a.CodSituation = 2;

这是小提琴:http://sqlfiddle.com/#!2/a731d [END]

[这里是以前的查询,供参考] 看起来像你只需要:

select * from table_name where CodSituation=2

让所有有情况的人2

使用mysql只获取最后一个条目:

select * from table_name where CodSituation=2 order by id desc limit 1

使用sql-server获取最后一个条目:

select top 1 * from table_name where CodSituation=2 order by ID desc;

请参阅此处的工作示例:

http://sqlfiddle.com/#!6/022fb/4

[编辑]

OP提供了一个实际的数据集:

select Name from table_name where CodSituation=2 group by Name;

这显示所有CodSituation为2的独特用户(每人一个条目)

http://sqlfiddle.com/#!3/be404/2

答案 1 :(得分:2)

可以这样实现,但可能不是最好的方法

基本上我正在做的是创建一个临时表并添加名称和最大行号。

然后再次匹配最大行号行与CodSituation = 2

相关联
 Create Table #Temp2(Name Varchar(10),RowN int)

;WITH CTE AS (SELECT *,RN=ROW_NUMBER() OVER(PARTITION BY Name ORDER BY ID) 
             FROM TableName)

insert into #Temp2         
SELECT Name,MAX(RN)
FROM CTE
Group By Name

select TT.*
from 
(
    SELECT *,RN=ROW_NUMBER() OVER(PARTITION BY Name ORDER BY ID) 
             FROM TableName
)TT
cross apply (
            select Name
            from #Temp2 TB
            where TB.Name=TT.Name and TB.RowN= TT.RN
            ) Tab
Where CodSituation=2    

小提琴Sample

答案 2 :(得分:2)

我发现连接字段更简单,使用max解决这个问题...谢谢!

SELECT
right(
max(
right(('0000000' + CONVERT(varchar,id) + '-'+ convert(varchar,codsituation)),4)),10),
name
FROM TABLE_NAME
GROUP BY name
HAVING 
right(
max(
right(

  ('0000000' + CONVERT(varchar,id) + '-'+ convert(varchar,codsituation))
  ,4)),1) = 2

http://sqlfiddle.com/#!3/3dc1c/10