2012-07-18 62 views
-3
的SQL最大的datetime

此語句返回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日期?我應該區分unitId

UPDATE

亞倫和flem aksed更多信息:

1 Template has N Units 
1 Unit has N Teststeps 

的一步步測試表的聚集主鍵是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, 

與在一步步測試表中的最重要領域的一步步測試

樣本數據可能是:

enter image description here

的一步步測試表明歷史化teststeps。從上面的圖片可以看出TeststepId = 4存在2次。歷史版本(58秒)和當前版本(59秒)。

我想只用59秒的時間才能在「當前」視圖中顯示teststepid 4。

更新2

我想只有teststepid 4 59秒 所有其他teststepId s with their current date. If there are only rows with different teststepid。就拿那些,因爲它們是當前行。

我正要改變我的集成測試並找到解決方案。

+0

你可以擴展你實際想要實現的目標嗎?例如當有多個單位時會發生什麼? – 2012-07-18 16:07:53

+0

同意@flem - 你想要「一排」,還是你想要一排*** PER UNITID ***?你能否指定我們知道我們正在回答的問題,還可以指定SQL Server的版本? – 2012-07-18 16:11:40

+0

@Aaron我更新了我的問題。你的解決方案都可以工作,問題是哪一個更快。通常不會存在超過20個具有相同標識但日期不同的測試步驟。所以我猜orderby子句比CTE快。 – Elisabeth 2012-07-18 17:49:47

回答

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; 

如果你想每單元ID一排,和SQL Server 2005 +,則:

;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; 
+0

如果有多個單元會怎麼樣? – 2012-07-18 15:56:26

+0

信息在問題中。 OP需要最高的CreatedAt值。在平局的情況下,沒有區別。 – 2012-07-18 16:03:26

+0

我想我們都做出了假設。我假定OP要爲每個單元設置最高的「createAt」。你認爲OP希望任何單位的最高「createAt」。 – 2012-07-18 16:07:07

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] 
+0

如果有多個單位會怎麼樣? – 2012-07-18 15:56:40

+0

@flem OP只希望返回的一行包含'max(ts.CreatedAt)',這是'ts.CreatedAt'按降序排列時的第一行。 – Widor 2012-07-18 16:02:42

+0

我認爲這有點冒失。如果是這樣的話,那麼答案不需要分組,只需一個簡單的'select top 1 ... where ... order by creatat desc' – 2012-07-18 16:05:16

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 
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) 
+1

你應該看看這個聲明的執行計劃哦,我的...... ;-) – Elisabeth 2012-07-18 15:45:02