-3

このステートメントは 2 つの行を返します。

SELECT ts.UnitId,ts.TeststepId, MAX(ts.CreatedAt)as CreatedAt 
FROM Teststep ts
INNER JOIN Unit u ON ts.UnitId = u.UnitId
Where u.TemplateId = 2 
Group by TeststepId, ts.UnitId

CreatedAt最高の日付を持つ1行を取得するにはどうすればよいですか? を区別する必要がありunitIdますか?

アップデート

詳細については、Aaron と flem に問い合わせてください。

1 Template has N Units
1 Unit has N Teststeps

Teststep テーブルのクラスター化された主キーは、TeststepId と CreatedAt です。

[TeststepId] [int] NOT NULL,

[Name] [nvarchar](50) NOT NULL,

[PreCondition] [nvarchar](500) NOT NULL,

[TestInstruction] [nvarchar](500) NOT NULL,

[ExpectedResult] [nvarchar](500) NOT NULL,

[CreatedAt] [datetime] NOT NULL,

[CreatedBy] [nvarchar](50) NOT NULL,

[UnitId] [int] NOT NULL,

テストステップテーブル

Teststep テーブルで最も重要なフィールドを含むサンプル データは次のようになります。

ここに画像の説明を入力

テストステップには、履歴化されたテストステップが表示されます。上の画像から、TeststepId = 4 が 2 回存在することがわかります。過去のバージョン (58 秒) と現在のバージョン (59 秒)。

「現在の」ビューに表示するために、59 秒の teststepid 4 のみを取得したいと考えています。

更新 2

59 秒の teststepid 4 のみを取得したいのですが、他のすべての teststepIds with their current date. If there are only rows with different teststepidは現在の行であるため、それらを取得します。

統合テストを変更して、解決策を見つけようとしています。

4

4 に答える 4

2
SELECT TOP (1) ts.UnitId, ts.TeststepId, ts.CreatedAt 
  FROM dbo.Teststep AS ts
  INNER JOIN Unit AS u 
  ON ts.UnitId = u.UnitId
  WHERE u.TemplateId = 2 
  ORDER BY ts.CreatedAt DESC;   

UnitIdおよびSQLServer2005以降ごとに行が必要な場合は、次のようにします。

;WITH x AS 
(
  SELECT ts.UnitId, ts.TestStepId, ts.CreatedAt,
    rn = ROW_NUMBER() OVER (PARTITION BY ts.UnitId ORDER BY ts.CreatedAt DESC)
  FROM dbo.Teststep AS ts
  INNER JOIN Unit AS u 
  ON ts.UnitId = u.UnitId
  WHERE u.TemplateId = 2 
)
SELECT UnitId, TestStepId, CreatedAt
  FROM x
  WHERE rn = 1;
于 2012-07-18T12:55:23.163 に答える
1

別の選択肢

これを試して:

WITH Data AS
(
    SELECT ts.UnitId, ts.TeststepId, ROW_NUMBER() OVER(PARTITION BY UnitId ORDER BY ts.CreatedAt DESC) Position
        FROM Teststep ts INNER JOIN Unit u ON ts.UnitId = u.UnitId
     WHERE u.TemplateId = 2 
)
SELECT *
  FROM Data
 WHERE Position = 1
于 2012-07-18T12:58:42.357 に答える
0
SELECT TOP 1 x.* FROM
    (SELECT ts.UnitId,ts.TeststepId, MAX(ts.CreatedAt)as CreatedAt FROM Teststep ts 
      INNER JOIN Unit u ON ts.UnitId = u.UnitId 
      Where u.TemplateId = 2  
      Group by TeststepId, ts.UnitId
      ORDER BY ts.CreatedAt DESC) as [x]
于 2012-07-18T12:55:36.690 に答える
0

別の方法:

with cte as (
SELECT ts.UnitId,ts.TeststepId, MAX(ts.CreatedAt)as CreatedAt 
FROM Teststep ts
INNER JOIN Unit u ON ts.UnitId = u.UnitId
Where u.TemplateId = 2 
Group by TeststepId, ts.UnitId)
select ts.UnitId,ts.TeststepId, CreatedAt from cte where CreatedAt
 =(select MAX(CreatedAt) from cte)
于 2012-07-18T12:58:55.327 に答える