使用GROUP BY
和MIN
以獲得每個ID的第一個日期:
SELECT dbo.table.ID,
MIN(dbo.otherTable.ServiceDate) AS EasliestDate
FROM dbo.table
INNER JOIN otherTable
ON dbo.table.ID = dbo.otherTable.ID
GROUP BY dbo.table.ID;
附錄
在談到一個問題的意見:
如何我是否也會限制它只顯示那些哈d特定年份的服務?
這要看您的具體要求,請考慮以下設置:
ID ServiceDate
--------------------
1 2014-05-01
1 2015-08-01
1 2016-07-07
2 2015-08-19
你只希望包括ID = 1,如果你指定的一年是2016年,但假設你還是想回去的第一個日期,那麼你需要添加一個具有case語句的having子句來獲取它。
DECLARE @Year INT = 2016;
DECLARE @YearStart DATE = DATEADD(YEAR, @Year - 1900, '19000101'),
@YearEnd DATE = DATEADD(YEAR, @Year - 1900 + 1, '19000101');
SELECT @YearStart, @YearEnd
SELECT t.ID,
MIN(o.ServiceDate) AS EasliestDate
FROM dbo.table AS t
INNER JOIN otherTable AS o
ON o.ID = r.ID
GROUP BY t.ID
HAVING COUNT(CASE WHEN o.ServiceDate >= @YearStart
AND o.ServiceDate < @YearEnd THEN 1 END) > 0;
如果你只是想在2016年的一個最早的日期where子句就夠
DECLARE @Year INT = 2016;
DECLARE @YearStart DATE = DATEADD(YEAR, @Year - 1900, '19000101'),
@YearEnd DATE = DATEADD(YEAR, @Year - 1900 + 1, '19000101');
SELECT @YearStart, @YearEnd
SELECT t.ID,
MIN(o.ServiceDate) AS EasliestDate
FROM dbo.table AS t
INNER JOIN otherTable AS o
ON o.ID = r.ID
WHERE o.ServiceDate >= @YearStart
AND o.ServiceDate < @YearEnd
GROUP BY t.ID;
值得注意的是,有我選擇來計算一年的開始一個很好的理由,而明年開始和使用
WHERE o.ServiceDate >= @YearStart
AND o.ServiceDate < @YearEnd
而不是僅僅
WHERE DATEPART(YEAR, o.ServiceDate) = 2016;
在前者中,可以使用ServiceDate
上的索引,而在後者中,必須在每條記錄上執行DATEPART
計算,這可能會導致嚴重的性能問題。
附錄2
要做到以下幾點:
我想那麼會是誰的ID最早的服務是我指定的年度確切的事情。
那麼你就需要一個having子句,不同的只是一到一個我以前貼:
DECLARE @Year INT = 2016;
DECLARE @YearStart DATE = DATEADD(YEAR, @Year - 1900, '19000101'),
@YearEnd DATE = DATEADD(YEAR, @Year - 1900 + 1, '19000101');
SELECT @YearStart, @YearEnd
SELECT t.ID,
MIN(o.ServiceDate) AS EasliestDate
FROM dbo.table AS t
INNER JOIN otherTable AS o
ON o.ID = r.ID
GROUP BY t.ID
HAVING MIN(o.ServiceDate) >= @YearStart
AND MIN(o.ServiceDate) < @YearEnd;
增編3
CREATE VIEW dbo.YourView
AS
SELECT dbo.table.ID,
MIN(dbo.otherTable.ServiceDate) AS EasliestDate
FROM dbo.table
INNER JOIN otherTable
ON dbo.table.ID = dbo.otherTable.ID
GROUP BY dbo.table.ID;
那麼你可以申請你的標準查看:
SELECT *
FROM dbo.YourView
WHERE EasliestDate >= '2015-01-01'
AND EasliestDate < '2016-01-01';
一般而言,您並不需要限制'from'子句中的表名。所以你真的應該在其他地方擺脫'dbo.'。 – shawnt00
@ shawnt00 Microsoft SQL Server管理Studio正在自動添加dbo。部分每當我使用表名。 – CSjunkie
我想這並不讓我感到意外,但它並不是最好的形式。您可以考慮查看別名(又名相關名稱)。 – shawnt00