2009-10-06 63 views
0

DDL創建模式和數據。我正在尋找一個其中語句,其中每個ID只返回一行,並且該行將成爲基於插入日期列的最後插入的行。根據日期列(SQL)爲每個ID返回一行

那麼結果將是約翰,5和Debbie,5

select Table1.Name, Table2.Rating 
From table1 join table2 on table1.ID = table2.ID 
where inserteddate = max(insertedate) 

..每個ID?這似乎很簡單,但我有一個腦袋。

DDL:

CREATE TABLE [dbo].[Table1](
    [Table1ID] [int] NULL, 
    [Name] [varchar](50) NULL 
) 

CREATE TABLE [dbo].[Table2](
    [Table2ID] [int] NULL, 
    [InsertedDate] [datetime] NULL, 
    [Rating] [varchar](50) NULL 
) 

INSERT INTO [dbo].[Table1]([Table1ID], [Name]) 
SELECT 1, N'John' UNION ALL 
SELECT 2, N'Debbie' 
INSERT INTO [dbo].[Table2]([Table2ID], [InsertedDate], [Rating]) 
SELECT 1, '20090101 00:00:00.000', N'6' UNION ALL 
SELECT 1, '20090401 00:00:00.000', N'5' UNION ALL 
SELECT 2, '20090202 00:00:00.000', N'3' UNION ALL 
SELECT 2, '20090303 00:00:00.000', N'5' 

回答

0

如何:

SELECT 
    Table1.Name, Table2.Rating 
FROM 
    table1 
INNER JOIN 
    table2 ON table1.Table1ID = table2.Table2ID 
WHERE 
    inserteddate = (SELECT MAX(InsertedDate) 
        FROM Table2 t2 
        WHERE t2.Table2ID = Table2.Table2ID) 

在這種情況下,在InsertedDate列的索引將是非常有益!

或者如果你的SQL Server 2005和了,你也可以使用一個CTE(公共表表達式)與ROW_NUMBER()和OVER聲明分區是這樣的:

WITH HelperCTE AS 
(
    SELECT 
    Table1.Name, Table2.Rating, 
    ROW_NUMBER() OVER(PARTITION BY Table1.Table1ID 
         ORDER BY Table2.InsertedDate DESC) AS 'RowNum' 
    FROM 
    table1 
    INNER JOIN 
    table2 ON table1.Table1ID = table2.Table2ID 
) 
SELECT Name, Rating FROM HelperCTE 
WHERE RowNum = 1 

這將創建像「臨時」視圖(CTE)和數字由Table1ID(每個單獨的個體Table1ID編號)分區項和訂單下降他們通過InsertedDate - 所以每一個獨特的Table1ID,最新的條目將有ROWNUM = 1

Marc

0

我敢肯定有一個更好的辦法,但這樣會做到這一點:

CREATE TABLE #Table1(
    [Table1ID] [int] NULL, 
    [Name] [varchar](50) NULL 
) 

CREATE TABLE #Table2(
    [Table2ID] [int] NULL, 
    [InsertedDate] [datetime] NULL, 
    [Rating] [varchar](50) NULL 
) 

INSERT INTO #Table1([Table1ID], [Name]) 
SELECT 1, N'John' UNION ALL 
SELECT 2, N'Debbie' 
INSERT INTO #Table2([Table2ID], [InsertedDate], [Rating]) 
SELECT 1, '20090101 00:00:00.000', N'6' UNION ALL 
SELECT 1, '20090401 00:00:00.000', N'5' UNION ALL 
SELECT 2, '20090202 00:00:00.000', N'3' UNION ALL 
SELECT 2, '20090303 00:00:00.000', N'5' 


select x.name, t2.rating 
from 
(
select t1.table1id, t1.name, max(t2.inserteddate) as inserteddate 
from #table1 t1 
join 
#table2 t2 
on 
t1.table1id = t2.table2id 
group by t1.table1id, t1.name 
) x 
join 
#table2 t2 
on 
x.table1id = t2.table2id 
and 
x.inserteddate = t2.inserteddate 
0
select 
    table1.name, 
    table2.rating 
from 
    table1 
    inner join table2 on 
     table2.id = (select top 1 t2.id from table2 t2 where table1.id = t2.id order by t2.inserteddate desc) 

哦,等等,表2沒有一個主鍵?然後......

select 
    table1.name, 
    (select top 1 t2.rating 
    from table2 t2 
    where table1.id = t2.id order by t2.inserteddate desc) as last_rating 
from 
    table1