选择一列中包含最新日期的行

时间:2017-05-30 10:41:43

标签: sql-server-2008 date select

我需要选择带有最新日期的ID2。我们有一个包含不同产品的行的dB,其中包含有效的自/至日期。我试图找到产品迄今为止的有效期,以及延长服务期限的时间。

如果产品在有效日期的同一期间(月)中有2个日期,则会出现此问题。然后我需要选择那个时期内最大的日期。

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

以dB为单位

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

3 个答案:

答案 0 :(得分: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

答案 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

答案 2 :(得分: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