0

私は2つのテーブルを持っています:

ルックアップテーブル(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

読み取り値を含む2番目のテーブル(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

私がする必要があるのは、のグループ列の各項目について、最新の読み取り値を持つ列と最も古い読み取り値を持つ列を結合tabTwoして作成することです。TabOneTabOne

一日の終わりに、次のようなテーブルが必要です。

    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     |             |              |

ありがとう!フレディ

4

2 に答える 2

1

これがSQLServer2005以降の場合、外部適用が役立ちます。

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

ライブテストは@SqlFiddleです。

于 2012-05-24T14:10:22.530 に答える
0

@NikolaMarkovinovićのソリューションは、サブクエリがメインクエリのSELECT句に直接移動された場合に、より普遍的に適用できるようになります。これにより、各サブクエリは1つの値のみを取得できるため、スカラー式として有効になります。

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を取得します。

于 2012-05-25T10:00:04.490 に答える