2017-02-23 69 views
0

有麻烦在这里找出一个查询,需要一些投入。我要加入多个表的查询,并为每个唯一值(VIN)返回多行SQL - 如何选择每个唯一值前3行返回

SELECT 
    T1.VIN 
    ,T1.station          
    ,T1.complete_time 
    ,T2.location 
    ,T1.previous_status 

FROM DBName.dbo.table_name1 T1 WITH (NOLOCK) 

LEFT OUTER JOIN DBName.dbo.table_name2 T2 WITH (NOLOCK) 
     ON T2.object_key = T1.queue_key 

LEFT OUTER JOIN DBName.dbo.table_name3 T3 WITH (NOLOCK) 
     ON T3.op_name = T1.op_name 

LEFT OUTER JOIN DBName.dbo.table_name4 T4 WITH (NOLOCK) 
     ON T1.VIN = T4.VIN 

WHERE T1.VIN IN 
(
'ABC12301' 
,'ABC12302' 
,'ABC12303' 
,'ABC12304' 
,'ABC12305' 
,'ABC12306' 
,'ABC12307' 
) 

ORDER BY T1.complete_time desc 

这里是我的输出是什么。它会显示所有返回的行对于每个唯一的VIN

VIN  Station Complete_Time  Location Previous_Status 
ABC12301 SOLD 2017-02-22 09:07:00  Y   800 
ABC12301 PIT  2017-02-22 09:05:00  P   610 
ABC12301 Drag 2017-02-22 09:03:00  P   610 
ABC12301 Rain 2017-02-22 09:03:00  P   610 
ABC12301 Trim 2017-02-22 09:01:00  P   610 
ABC12302 SOLD 2017-02-22 08:59:00  Y   800 
ABC12302 PIT  2017-02-22 08:57:00  P   610 
ABC12302 Drag 2017-02-22 08:56:00  P   610 
ABC12302 Rain 2017-02-22 08:54:00  P   610 
ABC12302 Trim 2017-02-22 08:50:00  P   610 
ABC12303 SOLD 2017-02-22 08:49:00  Y   800 
ABC12303 PIT  2017-02-22 08:47:00  P   610 
ABC12303 Drag 2017-02-22 08:46:00  P   610 
ABC12303 Rain 2017-02-22 08:44:00  P   610 
ABC12303 Trim 2017-02-22 08:40:00  P   610 
. 
. 
. 
.etc............. 

我想这是什么查询做的是只显示前3行每一个独特的VIN,像下面

VIN  Station Complete_Time  Location Previous_Status 
ABC12301 SOLD 2017-02-22 09:07:00  Y   800 
ABC12301 PIT  2017-02-22 09:05:00  P   610 
ABC12301 Drag 2017-02-22 09:03:00  P   610 

ABC12302 SOLD 2017-02-22 08:59:00  Y   800 
ABC12302 PIT  2017-02-22 08:57:00  P   610 
ABC12302 Drag 2017-02-22 08:56:00  P   610 

ABC12303 SOLD 2017-02-22 08:49:00  Y   800 
ABC12303 PIT  2017-02-22 08:47:00  P   610 
ABC12303 Drag 2017-02-22 08:46:00  P   610 
+1

哪种数据库? 'mysql'或'sql-server'? – DVT

+1

最有可能的sql_server ... MySQL不支持类似“WITH(NOLOCK)”的语法..请修复标签 –

+2

SQL Server也不喜欢NOLOCK。它能够而且将会返回重复和/或丢失的行以及其他奇怪的事情一大堆。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

回答

4

如果示例它是SQL-Server,那么这可能会奏效。此外,由于你正在做的左连接上的T3,T4没有从他们拉的任何数据,他们真的有必要吗?他们应该是INNER JOIN S'最后,我同意肖恩兰格的意见。

WITH cte AS (
    SELECT 
     T1.VIN 
     ,T1.station          
     ,T1.complete_time 
     ,T2.location 
     ,T1.previous_status 
     ,ROW_NUMBER() OVER (PARTITION BY T1.VIN ORDER BY T1.complete_time) AS RowNum 
    FROM DBName.dbo.table_name1 T1 --WITH (NOLOCK) 

    LEFT OUTER JOIN DBName.dbo.table_name2 T2 --WITH (NOLOCK) 
      ON T2.object_key = T1.queue_key 

    LEFT OUTER JOIN DBName.dbo.table_name3 T3 --WITH (NOLOCK) 
      ON T3.op_name = T1.op_name 
    -- Is T3 needed? 
    LEFT OUTER JOIN DBName.dbo.table_name4 T4 --WITH (NOLOCK) 
      ON T1.VIN = T4.VIN 
    -- Is T4 needed? 
    WHERE T1.VIN IN 
    (
    'ABC12301' 
    ,'ABC12302' 
    ,'ABC12303' 
    ,'ABC12304' 
    ,'ABC12305' 
    ,'ABC12306' 
    ,'ABC12307' 
    ) 
) 
SELECT * 
FROM 
    cte 
WHERE 
    RowNum < 4;