选择加入distinct / last

时间:2013-05-21 08:39:06

标签: sql sql-server-ce

好的,我有两张桌子,像这样:

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:得到了一些很棒的答案,不幸的是我忘了提到我还想让用户获得空状态值。我在那里添加了一个新用户

5 个答案:

答案 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)

我没有紧凑版,但我认为这应该有效:

SQL-SERVER 2008 EXAMPLE

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