2012-05-24 92 views
0

我有两个表:查找在SQL Server表的最大和最小日期值

的查找表(tabOne):

KEY | Group | Name | Desc | Val_Key 
    ---------------------------------------- 
    1 |  a | NameA | DescA | 10 
    2 |  b | NameB | DescB | 20 
    3 |  c | NameC | DescC | 30 
    4 |  d | NameD | DescD | 40 
    5 |  e | NameE | DescE | 50 
    6 |  f | NameF | DescF | 60 

包含第二表读数(tabTwo):

KEY | Date | Reading | Val_Key 
    ---------------------------------------- 
    1 | Date | Read  | 10 
    2 | Date | Read  | 20 
    3 | Date | Read  | 40 
    4 | Date | Read  | 40 
    5 | Date | Read  | 30 
    6 | Date | Read  | 20 
    7 | Date | Read  | 40 
    8 | Date | Read  | 20 
    9 | Date | Read  | 10 
    10 | Date | Read  | 20 
    11 | Date | Read  | 50 
    12 | Date | Read  | 60 

我需要做的是加入tabTwoTabOne,并创建一个列与最新的阅读和最老的一列读取TabOne的组列中的每个项目。

在这一天结束时,我希望有一个表,看起来如下:

KEY | Group | Name | Desc | Val_Key | LastReading | FirstReading | 
    ------------------------------------------------------------------------- 
    1 |  a | NameA | DescA | 10  |    |    | 
    2 |  b | NameB | DescB | 20  |    |    | 
    3 |  c | NameC | DescC | 30  |    |    | 
    4 |  d | NameD | DescD | 40  |    |    | 
    5 |  e | NameE | DescE | 50  |    |    | 
    6 |  f | NameF | DescF | 60  |    |    | 

谢谢! 房地美

+0

您希望在LastReading和FirstReading列中看到什么值?我们无法猜测你是否会留下那些空白...... –

+0

“阅读”专栏的价值,对不起,我认为这很明显。 – FreddieGericke

+0

那么什么是“最后”和“第一”?日期栏是否有实际日期?第7-12行有什么相关性? –

回答

1

如果这是SQL Server 2005或更新,outer apply将帮助:

select TabOne.*, 
     last.Reading LastReading, 
     first.Reading FirstReading 
from TabOne 
outer apply 
(
    select top 1 
     Reading 
    from TabTwo 
    where TabTwo.Val_Key = TabOne.val_Key 
    order by TabTwo.Date desc 
) last 
outer apply 
(
    select top 1 
     Reading 
    from TabTwo 
    where TabTwo.Val_Key = TabOne.val_Key 
    order by TabTwo.Date asc 
) first 

Live test is @ Sql Fiddle

+0

谢谢尼古拉,这就像一个魅力! – FreddieGericke

+0

不客气:-) –

0

@Nikola Markovinović's solution可以更普遍适用的进行,如果所述子查询被直接移动到主查询的SELECT从句,这是有可能它们中的每只检索一个值,并且,因此,作为一个标量表达式有效:

SELECT 
    t1.[KEY], 
    t1.[Group], 
    t1.Name, 
    t1.[Desc], 
    t1.Val_Key, 
    (
    SELECT TOP 1 Reading 
    FROM TabTwo 
    WHERE Val_Key = t1.Val_Key 
    ORDER BY Date DESC 
) AS LastReading, 
    (
    SELECT TOP 1 Reading 
    FROM TabTwo 
    WHERE Val_Key = t1.Val_Key 
    ORDER BY Date ASC 
) AS FirstReading 
FROM TabOne t1 

如果您需要例如一路上的日期,你可能不得不坚持尼古拉的解决方案。除此之外还有一个替代方案,但它更麻烦(虽然标准也更多):它将涉及将TabTwo的数据分组Val_Key以获得最早/最近的日期,每Val_Key,然后加入TabTwo以访问与找到的对应的整行日期以最终拉出必要的列,并最终将两个结果集加入TabOne以获得最终列集。