2009-10-06 82 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 
相关问题