我需要选择带有最新日期的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
答案 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
输出: