2017-05-30 28 views
0

我需要选择具有最新日期的ID2。我们有一个dB,其中包含不同产品的有效日期和起始日期。我试图找出产品的有效日期是否在一段时间内,以及是否延长了服务时间。在一列中选择最新日期的行

产品在有效日期的同一时期(几个月)有两个日期时会出现此问题。然后我需要选择那段时间内最好的日期。

也许值得注意的是,对于相同的ID2,可能会有更多的行具有更大的日期,这意味着我不能使用某种MAX(至少我认为)。

在分贝

ID1:| ID2:| ValidFrom: | ValidTo: | NextPayment: 
A1 | 123 | 2014-05-03 | 2015-01-02 | 2015-02-26 
A2 | 123 | 2015-01-03 | 2015-01-27 | 2015-02-26 
A3 | 456 | 2014-06-18 | 2015-01-02 | NULL 
A4 | 456 | 2015-01-03 | 2015-01-23 | NULL 

我想什么:

ID1:| ID2:| ValidFrom: | ValidTo: | NextPayment: 
A2 | 123 | 2015-01-03 | 2015-01-27 | 2015-02-26 
A4 | 456 | 2015-01-03 | 2015-01-23 | NULL 

*编辑:我使用Microsoft SQL Server 2008

+0

您在使用MySQL或MS SQL服务器?不要标记不涉及的产品。 – jarlh

+1

我删除了不兼容的数据库标签。请仅使用您正在使用的数据库进行标记。 –

+1

你的表有三个日期。真的不可能知道你的问题真的是什么。 –

回答

0

我有适合您的解决方案。它适用于多种DBMS:

SELECT dB.* FROM dB 
JOIN(
    SELECT ID2, MAX(ValidTo) 'MAX_ValidTo' FROM dB GROUP BY ID2) tb 
ON dB.ID2 = tb.ID2 AND dB.ValidTo = MAX_ValidTo 
0

您可以使用如下查询:

Select top 1 with ties Id1, Id2, ValidFrom, ValidTo, Nextpayment 
from yourtable 
    order by row_number() over(partition by ID2 order by ValidFrom desc) 

其他方式:

Select Id1, Id2, ValidFrom, ValidTo, Nextpayment from (
    Select *, 
     RowN = Row_number() over(partition by Id2 order by ValidFrom desc) 
from yourtable) a 
Where a.RowN = 1 
0

使用此:

CREATE TABLE [dbo].[test_table](
    [Id] [int] NULL, 
    [date] [date] NULL 
) ON [PRIMARY] 

GO 
INSERT [dbo].[test_table] ([Id], [date]) VALUES (1, CAST(N'2017-04-10' AS Date)) 
GO 
INSERT [dbo].[test_table] ([Id], [date]) VALUES (1, CAST(N'2017-04-15' AS Date)) 
GO 
INSERT [dbo].[test_table] ([Id], [date]) VALUES (1, CAST(N'2017-04-08' AS Date)) 
GO 
INSERT [dbo].[test_table] ([Id], [date]) VALUES (2, CAST(N'2017-05-27' AS Date)) 
GO 
INSERT [dbo].[test_table] ([Id], [date]) VALUES (2, CAST(N'2017-05-22' AS Date)) 
GO 
INSERT [dbo].[test_table] ([Id], [date]) VALUES (1, CAST(N'2017-05-24' AS Date)) 
GO 

查询:

select Id, max(date) as "greatest date" 
from test_table 
group by DATEPART(mm,date),Id 

输出:

output