SQL查询过滤表2中的前1行,基于表1中每种类型的最新日期

时间:2015-05-20 01:57:05

标签: sql join

从Table1中获取按类型过滤的所有记录,其中包含“0x”,并显示Table2中相应的CaseID,DocID和Date。从表2中,只根据最新日期获得前1名记录。

我需要编写一个sql查询来获取输出。请帮助。

表1

ID | Name | Type  | Description
1  | A    | 0x100 | Description Text 1
2  | B    | 0x200 | Description Text 2
3  | C    | 0x300 | Description Text 3
4  | D    | XYS   | Description Text 4

表2

CaseID | DocID | Type  | Date
A1     | 1     | 0x100 | 4/28/2014
A2     | 2     | 0x100 | 4/29/2014
A3     | 3     | 0x100 | 4/30/2014
A4     | 4     | 0x100 | 5/1/2014
A5     | 5     | 0x100 | 5/2/2014
A6     | 1     | 0x200 | 3/3/2015
A7     | 2     | 0x200 | 3/1/2015
A8     | 3     | 0x300 | 1/1/2015
A9     | 4     | 0x300 | 1/2/2015
A10    | 5     | 0x300 | 1/3/2015
A11    | 11    | 0x300 | 1/4/2015

结果

ID | Name | Type  | Description        | CaseID | DocID | Date
1  | A    | 0x100 | Description Text 1 | A5     | 5     | 5/2/2014
2  | B    | 0x200 | Description Text 2 | A6     | 1     | 3/3/2015
3  | C    | 0x300 | Description Text 3 | A11    | 11    | 1/4/2015

2 个答案:

答案 0 :(得分:0)

也许以下(测试过!):

SELECT
    t1.Name, t1.Type, t1.Description, t2.CaseID, t2.DocID, t2.Date
FROM
    (SELECT Type, MAX(Date) AS MaxDate FROM Table2 GROUP BY Type) AS t2max -- FIRST
    JOIN table2 AS t2 ON t2max.Type = t2.Type AND t2max.MaxDate = t2.Date -- SECOND
    JOIN table1 AS t1 ON t2.Type = t1.Type -- THIRD
WHERE
    t2.type LIKE '0x%'
ORDER BY
    t1.Name;

好的,解释:首先,查询引擎查看from子句。它有三张表可以连接在一起。第一个是由子查询创建的;它是表2中按日期排名的顶级记录的类型/日期对。第二个是table2的其余部分;我们将这两者结合在一起,以便我们现在可以使用table2中的所有列。然后from子句中的第三个表是table1,我们将它连接到Type列上的当前行源。此时,我们从子查询,table2和table1中获得了包含列的行源。查询引擎接下来会过滤掉我们不想要的行;那些不在期望的“0x%”中的那些' 0x%'格式。 select子句指出我们只需要结果集中来自行源的特定列,因此查询引擎会抓取它们,按照order by子句对它们进行排序,并吐出结果。

答案 1 :(得分:0)

SELECT t.ID
    ,t.Name
    ,t.Type
    ,t.Description
    ,t2.CaseID
    ,t2.DocID
  ,MAX(t2.Date) as DocDate
FROM Table1 AS t
JOIN Table2 t2
  ON t.Type = t2.Type
WHERE t.Type like '0x%'
GROUP BY t.ID
    ,t.Name
    ,t.Type
    ,t.Description
    ,t2.CaseID
    ,t2.DocID
HAVING t2.Date = MAX(t2.Date) 

我能正确读你吗?