1

私はこのSQLを持っています:

Select history.date, history.rasID, status.status
From RAS_RASHistory as history
inner join RAS_Status as status on History.statusID = status.statusID
Where history.date between @startDate 
      and @endDate and history.statusID in (select value from @status)
order by rasID, history.date desc

実行すると、次の結果が得られます。

date                    rasID   status
2011-11-17 14:15:21.693 10000   Planning
2011-11-17 14:14:53.177 10000   New
2011-11-16 08:39:47.770 10000   New
2011-11-16 09:18:50.630 10001   New
2011-11-16 11:26:23.867 10002   Planning
2011-11-16 10:01:42.050 10002   Planning
2011-11-16 10:00:36.527 10002   New

私が本当に欲しいのはこれです:

date                    rasID   status
2011-11-17 14:15:21.693 10000   Planning
2011-11-16 09:18:50.630 10001   New
2011-11-16 11:26:23.867 10002   Planning

しかし、それを手に入れる方法が正確にはわかりません。サブセレクトがその方法かもしれないと思いますが、よくわかりません。誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

1
;WITH x AS 
(
  Select h.[date], h.rasID, s.[status], -- please pick better column names!
    rn = ROW_NUMBER() OVER (PARTITION BY h.rasID ORDER BY h.[date] DESC)
  FROM dbo.RAS_RASHistory as h -- please use dbo prefix!
  INNER JOIN dbo.RAS_Status as s -- please use manageable aliases!
  ON h.statusID = s.statusID
  Where h.date between @startDate and @endDate 
  and h.statusID in (select value from @status)
)
SELECT [date], rasID, [status]
FROM x
WHERE rn = 1
order by rasID, [date] desc;

BETWEENまた、日付範囲にも十分注意してください

これを次のように書き直すこともできます。

;WITH h AS
(
  SELECT [date], rasID, statusID,
    rn = ROW_NUMBER() OVER (PARTITION BY rasID ORDER BY [date] DESC
  FROM dbo.RAS_RASHistory
  WHERE [date] BETWEEN @startDate AND @endDate
  AND statusID IN (SELECT value FROM @status)
)
SELECT h.[date], h.rasID, s.[status]
   FROM h INNER JOIN dbo.RAS_Status AS s
   ON h.statusID = s.StatusID
   AND h.rn = 1
ORDER BY h.rasID, h.[date] DESC;
于 2013-03-29T19:18:38.650 に答える