好的,我有两张桌子,像这样:
Person:
| ID | Name |
+----+------+
| 0 | Carl |
+----+------+
| 1 | Max |
+----+------+
| 2 | Lars |
Status
| PersonID | Submitted | Status |
+----------+------------+--------+
| 0 | *DATETIME* | 1 |
+----------+------------+--------+
| 0 | *DATETIME* | 1 |
+----------+------------+--------+
| 0 | *DATETIME* | 3 |
+----------+------------+--------+
| 0 | *DATETIME* | 1 |
+----------+------------+--------+
| 1 | *DATETIME* | 5 |
+----------+------------+--------+
我想要回忆的是让用户表中的所有人都获得最后提交的状态。
如果我使用这样的东西:
SELECT DISTINCT
Person.Name As Username,
Status.Status As Userstatus
FROM Person
LEFT JOIN Status
ON Status.PersonID = Person.ID
我得到这样的结果:
| Username | Userstatus |
+----------+------------+
| Carl | 1 |
+----------+------------+
| Carl | 3 |
+----------+------------+
| Max | 5 |
+----------+------------+
| Lars | NULL |
+----------+------------+
那么,我该怎么做呢?在这种情况下,假设最新的Status.Submitted是== 1(Status.PersonID的最后一行,其中PersonID == 0),跳过其他Carls。
编辑:我忘记写了我使用SQL Compact。Edit2:得到了一些很棒的答案,不幸的是我忘了提到我还想让用户获得空状态值。我在那里添加了一个新用户
答案 0 :(得分:1)
将聚合函数max
与group by语句结合使用。
SELECT
person.Name As Username,
s3.status As Userstatus
FROM person
LEFT JOIN (
select s.person_id, s.status
from status s
join (select max(submitted) as last,person_id
from status group by person_id) s2
on s.person_id = s2.person_id
where s.submitted = s2.last) s3
ON person.id = s3.person_id;
Sql Fiddle: http://sqlfiddle.com/#!2/9822b/19
答案 1 :(得分:1)
试试 Query
:
SELECT
Person.Name As Username,
Status.Status As Userstatus
FROM Person
INNER JOIN Status
ON Status.PersonID = Person.ID
WHERE Status.Submitted in
(Select Max(Submitted) from Status group by PersonID)
答案 2 :(得分:1)
我没有紧凑版,但我认为这应该有效:
select person.name as username,
x.status as userstatus
from person left join (
select s.personId, s.status
from status s join (
select personId, max(submitted) subs
from status
group by personid ) s2
on s.personid = s2.personid and s.submitted = s2.subs
) x on person.id = x.personid
| USERNAME | USERSTATUS |
-------------------------
| Carl | 1 |
| Max | 5 |
答案 3 :(得分:0)
SELECT
Person.Name As Username,
Status.Status As Userstatus
FROM Person
OUTER APPLY (
SELECT TOP(1)
*
FROM Status
WHERE Status.PersonID = Person.ID
ORDER BY Status.Submitted DESC
) AS [Status]
答案 4 :(得分:0)
试试这个 -
SELECT Username,Userstatus<br>
FROM
(
SELECT
Person.Name As Username,
Status.Status As Userstatus,
ROW_NUMBER() OVER (PARTITION BY Status.PersonID ORDER BY Status.Submitted DESC) AS RN,
FROM Person
LEFT JOIN Status
ON Status.PersonID = Person.ID
)
WHERE rn=1