2012-05-24 168 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以獲得最終列集。