Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как найти запись с максимально близкой датой к последней дате месяца?  [new]
guest789
Guest
добрый день.
подскажите пожалуйста, можно ли как-то запросом получить запись из таблицы продаж, которая будет максимально близкой к последней дате месяца? в таблице продаж записи могут быть не каждый день, увы.
т.е. если за сентябрь в таблице продаж есть записи за 01.09.2015, 05.09.2015, 18.09.2015 то вывестись должна запись за 18.09.2015.
плюс, это надо делать еще и с учетом товара который был продан, такая запись может быть по каждому товару. код товара хранится в таблице sales в поле product_id.
т.е. итоговая запись должна выглядеть следующим образом:
последняя дата месяца, максимально близкая дата, товар на максимально близкую дату, сумма на максимально близкую дату
30.09.2015, 18.09.2015, 165, 3000

CREATE TABLE Sales(
	[ID] [bigint] IDENTITY(1,1) NOT NULL,
	[Product] [bigint] NOT NULL,
	[Sales_Date] [date] null, 
	[Sales_amount] [money] NULL
)


в принципе есть еще таблица с датами, не знаю насколько она может быть полезной, в ней просто 1 поле в котором хранится дата на каждый день.

спасибо
16 дек 15, 19:24    [18569712]     Ответить | Цитировать Сообщить модератору
 Re: как найти запись с максимально близкой датой к последней дате месяца?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4805
guest789,
DECLARE @T TABLE 
(
	[Product] CHAR(1) NOT NULL,
	[Sales_Date] [date] null, 
	[Sales_amount] [money] NULL
)

INSERT INTO @T VALUES('A', '2015-01-01', 1)
INSERT INTO @T VALUES('A', '2015-01-05', 2)
INSERT INTO @T VALUES('A', '2015-01-08', 3)
INSERT INTO @T VALUES('A', '2015-01-09', 4)
INSERT INTO @T VALUES('A', '2015-01-29', 5)
INSERT INTO @T VALUES('A', '2015-02-01', 6)
INSERT INTO @T VALUES('A', '2015-02-05', 7)
INSERT INTO @T VALUES('A', '2015-02-08', 8)
INSERT INTO @T VALUES('A', '2015-02-09', 9)
INSERT INTO @T VALUES('A', '2015-02-23', 0)
INSERT INTO @T VALUES('B', '2015-01-01', 1)
INSERT INTO @T VALUES('B', '2015-01-05', 2)
INSERT INTO @T VALUES('B', '2015-01-08', 3)
INSERT INTO @T VALUES('B', '2015-01-09', 4)
INSERT INTO @T VALUES('B', '2015-01-30', 5)
INSERT INTO @T VALUES('B', '2015-02-01', 6)
INSERT INTO @T VALUES('B', '2015-02-05', 7)
INSERT INTO @T VALUES('B', '2015-02-08', 8)
INSERT INTO @T VALUES('B', '2015-02-09', 9)
INSERT INTO @T VALUES('B', '2015-02-26', 0)

SELECT TOP 1 WITH TIES * FROM @T
ORDER BY ROW_NUMBER() OVER (PARTITION BY [Product], DatePart(year, [Sales_Date]), DatePart(month, [Sales_Date]) ORDER BY [Sales_Date] DESC )
16 дек 15, 20:01    [18569860]     Ответить | Цитировать Сообщить модератору
 Re: как найти запись с максимально близкой датой к последней дате месяца?  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
автор
DECLARE @T TABLE
(
[Product] CHAR(1) NOT NULL,
[Sales_Date] [date] null,
[Sales_amount] [money] NULL
)

INSERT INTO @T VALUES('A', '2015-01-01', 1)
INSERT INTO @T VALUES('A', '2015-01-05', 2)
INSERT INTO @T VALUES('A', '2015-01-08', 3)
INSERT INTO @T VALUES('A', '2015-01-09', 4)
INSERT INTO @T VALUES('A', '2015-01-29', 5)
INSERT INTO @T VALUES('A', '2015-02-01', 6)
INSERT INTO @T VALUES('A', '2015-02-05', 7)
INSERT INTO @T VALUES('A', '2015-02-08', 8)
INSERT INTO @T VALUES('A', '2015-02-09', 9)
INSERT INTO @T VALUES('A', '2015-02-23', 0)
INSERT INTO @T VALUES('B', '2015-01-01', 1)
INSERT INTO @T VALUES('B', '2015-01-05', 2)
INSERT INTO @T VALUES('B', '2015-01-08', 3)
INSERT INTO @T VALUES('B', '2015-01-09', 4)
INSERT INTO @T VALUES('B', '2015-01-30', 5)
INSERT INTO @T VALUES('B', '2015-02-01', 6)
INSERT INTO @T VALUES('B', '2015-02-05', 7)
INSERT INTO @T VALUES('B', '2015-02-08', 8)
INSERT INTO @T VALUES('B', '2015-02-09', 9)
INSERT INTO @T VALUES('B', '2015-02-26', 0)

select t.product,t.Sales_Date,t.Sales_amount
from @t t
join(
select product,max(sales_date) as t_date
from @T
group by Product,year(sales_date),month(sales_date)
) a
on t.Product = a.Product
and t.Sales_Date = a.t_date
order by t.product,t.Sales_Date
16 дек 15, 20:18    [18569936]     Ответить | Цитировать Сообщить модератору
 Re: как найти запись с максимально близкой датой к последней дате месяца?  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
DECLARE @T TABLE 
(
	[Product] CHAR(1) NOT NULL,
	[Sales_Date] [date] null, 
	[Sales_amount] [money] NULL
)

INSERT INTO @T VALUES('A', '2015-01-01', 1)
INSERT INTO @T VALUES('A', '2015-01-05', 2)
INSERT INTO @T VALUES('A', '2015-01-08', 3)
INSERT INTO @T VALUES('A', '2015-01-09', 4)
INSERT INTO @T VALUES('A', '2015-01-29', 5)
INSERT INTO @T VALUES('A', '2015-02-01', 6)
INSERT INTO @T VALUES('A', '2015-02-05', 7)
INSERT INTO @T VALUES('A', '2015-02-08', 8)
INSERT INTO @T VALUES('A', '2015-02-09', 9)
INSERT INTO @T VALUES('A', '2015-02-23', 0)
INSERT INTO @T VALUES('B', '2015-01-01', 1)
INSERT INTO @T VALUES('B', '2015-01-05', 2)
INSERT INTO @T VALUES('B', '2015-01-08', 3)
INSERT INTO @T VALUES('B', '2015-01-09', 4)
INSERT INTO @T VALUES('B', '2015-01-30', 5)
INSERT INTO @T VALUES('B', '2015-02-01', 6)
INSERT INTO @T VALUES('B', '2015-02-05', 7)
INSERT INTO @T VALUES('B', '2015-02-08', 8)
INSERT INTO @T VALUES('B', '2015-02-09', 9)
INSERT INTO @T VALUES('B', '2015-02-26', 0)

select t.product,t.Sales_Date,t.Sales_amount
from @t t
join(
select product,max(sales_date) as t_date
from @T
group by Product,year(sales_date),month(sales_date)
) a
on t.Product = a.Product
and t.Sales_Date = a.t_date
order by t.product,t.Sales_Date
16 дек 15, 20:27    [18569998]     Ответить | Цитировать Сообщить модератору
 Re: как найти запись с максимально близкой датой к последней дате месяца?  [new]
guest789
Guest
все работает, всем спасибо )
16 дек 15, 22:34    [18570499]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить