2017-05-08 97 views
1

我有一个查询,其中我想从我的ROW_NUMBER()选择中获取最近的日期。我在ORDER BY条款中尝试了MAX()DESC。它没有显示最近的日期为RowNum 1SQL Row_Number()不排序日期

这是我的查询:

;WITH cte3 AS 
(  
    SELECT 
     o.PartNo, 
     o.JobNo, 
     MAX(tt.TicketDate) as rawr, 
     ROW_NUMBER() OVER (PARTITION BY o.JobNo, o.PartNo 
          ORDER BY tt.TicketDate DESC) as RowNum  
    FROM 
     OrderDet AS o  
    INNER JOIN 
     TimeTicketDet AS tt ON o.JobNo = tt.JobNo  
    WHERE 
     o.Status = 'Open' 
    GROUP BY 
     tt.TicketDate, o.JobNo, o.PartNo 
)  
SELECT * 
FROM cte3 

当我把它给了我正确的结果,我会在CTE查询添加一个WHERE RowNum = 1

从我目前的查询,这是结果:

+--------+-------+-----------+--------+ 
| PartNo | JobNo | rawr | RowNum | 
+--------+-------+-----------+--------+ 
| 1234 | 20 | 5/30/2012 |  1 | 
| 1234 | 20 | 5/29/2012 |  2 | 
| 1234 | 20 | 5/25/2012 |  3 | 
| 1234 | 20 | 5/24/2012 |  4 | 
| 1234 | 20 | 5/23/2012 |  5 | 
| 1234 | 20 | 5/22/2012 |  6 | 
| 1234 | 20 | 5/16/2012 |  7 | 
| 1234 | 20 | 5/15/2012 |  8 | 
| 1234 | 20 | 5/14/2012 |  9 | 
| 1234 | 20 | 5/11/2012 |  10 | 
| 1234 | 20 | 5/10/2012 |  11 | 
| 1234 | 20 | 5/9/2012 |  12 | 
| 1234 | 20 | 3/27/2015 |  13 | 
| 1234 | 20 | 1/3/2013 |  14 | 
| 1234 | 20 | 1/2/2013 |  15 | 
+--------+-------+-----------+--------+ 

RowNum = 13是最近的日期。我是否会错误地或不正确地将我的日期转换成类型?

编辑:

TimeTicketDet表的示例数据:

+------------+-------+ 
| TicketDate | JobNo | 
+------------+-------+ 
| 5/9/2012 | 20 | 
| 5/10/2012 | 20 | 
| 5/24/2012 | 20 | 
| 3/27/2015 | 20 | 
| 5/22/2012 | 20 | 
| 5/10/2012 | 20 | 
| 5/11/2012 | 20 | 
| 5/9/2012 | 100 | 
| 5/10/2012 | 100 | 
| 5/24/2012 | 100 | 
| 3/27/2015 | 100 | 
| 5/22/2012 | 100 | 
| 5/10/2012 | 100 | 
| 5/11/2012 | 100 | 
+------------+-------+ 

OrderDet表的示例数据:

+--------+--------+-------+ 
| PartNo | Status | JobNo | 
+--------+--------+-------+ 
| 1234 | Open | 20 | 
| 1234 | Open | 100 | 
+--------+--------+-------+ 

所需的结果:

+--------+------------+-------+--------+ 
| PartNo | TicketDate | JobNo | RowNum | 
+--------+------------+-------+--------+ 
| 1234 | 3/27/2015 | 20 |  1 | 
| 1234 | 3/27/2015 | 100 |  1 | 
+--------+------------+-------+--------+ 
+7

关于什么是'TicketDate'列的数据类型?它可能是一个字符串/ varchar?它看起来不像基于排序的日期时间。 – ollie

+2

看起来就像你的“Group By”不应该有'tt.TicketDate'。没有这个尝试。 – RBarryYoung

+0

当我使用row_number这样的事情时,我不使用group by或aggregates。 我只是在哪里RowNum = 1 –

回答

2

正如我在my comment提到的,由于你的TicketDate列是一个字符,你需要convert itdatetime为了通过实际日期来排序。现在,你正在通过字符串值来排序它是不正确的。

我建议你改变你的查询是这样的:

;WITH cte3 AS 
(  
    SELECT 
     o.PartNo, 
     o.JobNo, 
     MAX(tt.TicketDate) as rawr, 
     ROW_NUMBER() OVER (PARTITION BY o.JobNo, o.PartNo 
          ORDER BY cast(tt.TicketDate as datetime) DESC) as RowNum  
    FROM 
     OrderDet AS o  
    INNER JOIN 
     TimeTicketDet AS tt ON o.JobNo = tt.JobNo  
    WHERE 
     o.Status = 'Open' 
    GROUP BY 
     cast(tt.TicketDate as datetime), o.JobNo, o.PartNo 
)  
SELECT * 
FROM cte3 
where RowNum = 1; 

这里是一个demo。通过在row_number中将char转换为datetime,您将按日期而不是字符串对数据进行排序。

此外,你并不真正需要的max()GROUP BY因为由铸造TicketDate为datetime将返回正确的行:

;WITH cte3 AS 
(  
    SELECT 
     o.PartNo, 
     o.JobNo, 
     tt.TicketDate as rawr, 
     ROW_NUMBER() OVER (PARTITION BY o.JobNo, o.PartNo 
          ORDER BY cast(tt.TicketDate as datetime) DESC) as RowNum  
    FROM 
     #OrderDet AS o  
    INNER JOIN 
     #TimeTicketDet AS tt ON o.JobNo = tt.JobNo  
    WHERE 
     o.Status = 'Open' 
)  
SELECT * 
FROM cte3 
where RowNum =1; 
+0

你不需要为'MAX(cast(tt.TicketDate as datetime))'添加剧组吗? –

+0

这就是诀窍!谢谢!我会在这个数据库中更好地了解一些奇怪的东西,比如字符串作为日期和什么。我非常感谢你的帮助。 –

+0

@JuanCarlosOropeza你是对的,我其实是在向我的回答添加这个的过程 – ollie

1

由于奥利建议你可以CAST你的字符串DATETIME而你不需要额外的Group By

SQL DEMO

;WITH cte3 AS 
(  
    SELECT 
     o.PartNo, 
     o.JobNo, 
     tt.TicketDate as rawr, 
     ROW_NUMBER() OVER (PARTITION BY o.JobNo, o.PartNo 
          ORDER BY cast(tt.TicketDate as datetime) DESC) as RowNum  
    FROM OrderDet AS o  
    JOIN TimeTicketDet AS tt 
     ON o.JobNo = tt.JobNo  
    WHERE 
     o.Status = 'Open' 
)  
SELECT * 
FROM cte3 
WHERE RowNum = 1 

输出

enter image description here

+0

感谢您的帮助,并跟进每一条评论。 –