我无法考虑如何构建符合我需求的sql语句,如果这是不可能的,请告诉我。
我有一张这样的桌子(我不承认这些不会给我带来麻烦)
table:servicio
------------------------------------------------------------
id | swo | date | issueValue |
1 | 15-001 | 2015-01-29 01:52:59 | 2
1 | 15-002 | 2015-01-30 01:24:00 | 2
------------------------------------------------------------
表:评论
------------------------------------------------------------
id | swo | date | Area |
1 | 15-001 | 2015-01-29 01:52:59 | 2
1 | 15-002 | 2015-01-30 01:24:00 | 1
1 | 15-002 | 2015-01-30 01:50:00 | 3
------------------------------------------------------------
我想在servicio中选择行,但包括分配给每个swo的最新区域。结果应该是这样的。
------------------------------------------------------------
id | swo | date | Area |
1 | 15-001 | 2015-01-29 01:52:59 | 2
1 | 15-002 | 2015-01-30 01:24:00 | 3
------------------------------------------------------------
那么如何让sql语句检查top(1)并返回其中的区域值?
答案 0 :(得分:1)
在SQL Server中,您可以使用apply
,子查询或row_number()
执行此操作。这是第一种方法:
select s.*, c.area
from servicio s outer apply
(select top 1 c.*
from comments c
where c.swo = s.swo
order by c.date desc
) c;
使用此方法,您可以根据需要提取其他列。
答案 1 :(得分:0)
这是Rownumber和子查询的解决方案。在子查询中,您将选择表之间匹配的所有行。为Comment表日期列创建升序,为每个SWO创建分区(分区意味着它将在每个不同的SWO上重置计数器)。 1 =特定SWO的上次日期。在最终选择中,您只需将WERE子句与Rownum = 1
放在一起SELECT swo ,date ,issueValue ,Area
FROM
(SELECT
SRV.swo
,SRV.date
,SRV.issueValue
,CMNT.Area
,ROW_NUMBER() OVER (PARTITION BY CMNT.swo ORDER BY CMNT.date DESC) AS Dsc_Rank
FROM servicio AS SRV
LEFT JOIN comments AS CMNT
ON (SRV.swo=CMNT.swo)
) AS Temp
WHERE Temp.Dsc_Rank = 1 /* Descending Date Rank 1 = Latest date from Comment table*/
注意:例如,在Teradata中,您可以省略子查询并使用Qualify子句