我有下表
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我也想要它们。
答案 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的独特用户(每人一个条目)
答案 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