1

私は以下のように2つのテーブルを持っています-

表I

ID  DATE
1   05/11/12
2   23/11/12
3   29/11/12
4   04/10/12
5   20/11/12

そして、次の情報を持つ別のテーブル(IH)-

ID  RECNO   NOTE
1   1       Open
1   2       Update
1   3       Close
2   1       Open
2   2       Update
2   3       Hold
2   4       Close
3   1       Open
4   1       Open
4   2       Update
5   1       Open

IDごとにRecNoの最大値を使用してNoteフィールドを表示し、以下のような結果を出力したいと思います。したがって、上記のデータを使用すると、出力は次のようになります。

ID  DATE        NOTE
2   23/11/12    Close
3   29/11/12    Open

私が持っているコードは-

SELECT I.ID, I.DATE, IH.NOTE FROM
I I, IH IH
JOIN (SELECT MAX([RECNO]) [RECNO] FROM
IH
GROUP BY RECNO) IH2 ON IH2.ID = IH.ID AND
IH2.[RECNO] = IH.[RECNO]
JOIN I I2 ON I2.ID = IH.ID WHERE
(I2.DATE>={TS ‘2012-11-22 00:00:002}) GROUP BY I2.ID

ただし、コードを実行すると、次のようになります。

Invalid Column Name 'RECNO'. Statement(s) could not be prepared.
4

5 に答える 5

1

これはどう?試していないことに注意してください。現在、Macを使用しています。

SELECT I.ID, I.DATE, IH.NOTE
FROM I I
OUTER APPLY 
  (SELECT TOP 1 *
   FROM IH 
   WHERE IH.ID = I.ID
   ORDER BY RECNO DESC) IH    
WHERE I.DATE >= '2012-11-22'
于 2012-11-20T17:20:49.807 に答える
0

あなたの SQL はかなり厄介です。

row_number()SQL Server 2005 以降を使用していると仮定すると、次のように関数を使用できます。

SELECT I.ID, I.DATE, IH.NOTE
FROM I join
     (select ih.*, ROW_NUMBER() over (PARTITION by id order by recno desc) as seqnum
      from IH
     ) ih
     on IH2.[RECNO] = IH.[RECNO] and seqnum = 1
WHERE I2.DATE>='2012-11-22 00:00:002'

これは、値「1」を取得する最高のレコード番号を持つ各 ID に対して、IH テーブルにシーケンス番号を割り当てています。残りは単なるSQLです。

元のクエリは構文的に正しくありませんが、説明に基づいてこれが必要だと思います。

于 2012-11-20T17:18:14.890 に答える
0

多分これは役立つでしょう

SELECT a.ID, a.DATE, b.NOTE FROM a
inner join  b on a.ID = b.ID
where b.recno in (select max(bb.recno)
               from b as bb where bb.id = b.id)

http://sqlfiddle.com/#!3/fd141/2

于 2012-11-20T17:22:41.160 に答える
0

さまざまな識別子を気にしない場合は、次の解決策を見てください。

select t1.MyID, t1.MyDate, y.Note
from t1
join
(
    select MyID, max(RecNo) as RecNo
    from t2
group by MyID
) x
    on t1.MyID = x.MyID
left join
(
    select *
    from t2
) y
    on t1.MyID = y.MyID
and x.RecNo = y.RecNo
where t1.MyDate >= '2012.11.22'

完全なソリューションはこちら: http://sqlfiddle.com/#!3/4ca09/3

更新:おっと、where 句に日付を入れるのを忘れていました。SQL Fiddle と上記のクエリを更新しました。

于 2012-11-20T19:03:32.830 に答える
0

そしてもう一つ

SELECT I.ID, I.DATE
,(Select TOP 1 IH.NOTE FROM IH where IH.ID=i.ID Order by Recno DESC) as Note
from I
WHERE
I.DATE>'20121122'
于 2012-11-20T17:21:38.590 に答える