Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите составить выборку..  [new]
Cheerful Calf
Member

Откуда: Lithuania
Сообщений: 6994
Из данной таблицы надо выбрать все записи, начиная с последнего поля StartingDate, предшествующего сегодняшней дате.
Результат должен быть (АйДи): 3, 4, 5, 6, 7, 9

Заранее благодарю.

CREATE TABLE [dbo].[tempSalesPrice](
	[ID] [int] NOT NULL PRIMARY KEY,
	[ItemCodeID] [int] NOT NULL,
	[SalesPriceWVAT] [money] NOT NULL,
	[StartingDate] [datetime] NOT NULL)
GO
	
INSERT INTO tempSalesPrice VALUES(1, 1, 10, '2012.05.01')
INSERT INTO tempSalesPrice VALUES(2, 1, 10, '2012.06.01')
INSERT INTO tempSalesPrice VALUES(3, 1, 10, '2012.10.01')
INSERT INTO tempSalesPrice VALUES(4, 1, 10, '2012.11.01')
INSERT INTO tempSalesPrice VALUES(5, 1, 10, '2012.12.01')
INSERT INTO tempSalesPrice VALUES(6, 2, 10, '2012.07.01')
INSERT INTO tempSalesPrice VALUES(7, 2, 10, '2012.12.01')
INSERT INTO tempSalesPrice VALUES(8, 3, 10, '2012.01.01')
INSERT INTO tempSalesPrice VALUES(9, 3, 10, '2012.02.01') 
4 окт 12, 17:26    [13269598]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку..  [new]
Glory
Member

Откуда:
Сообщений: 104760
Оператор > уже отменили что ли ?
Или отменили функцию получения сегодняшней даты ?
4 окт 12, 17:30    [13269630]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку..  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
Cheerful Calf,

это как же такие ID получились?
Исходя из постановки задачи как я её понял,
SELECT *
FROM #tempSalesPrice
WHERE StartingDate>=DATEADD(DAY,DATEDIFF(DAY,0,CURRENT_TIMESTAMP)-1,0);
Результат - 4,5,7
4 окт 12, 17:31    [13269631]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку..  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
iap
Cheerful Calf,

это как же такие ID получились?
Исходя из постановки задачи как я её понял,
SELECT *
FROM #tempSalesPrice
WHERE StartingDate>=DATEADD(DAY,DATEDIFF(DAY,0,CURRENT_TIMESTAMP)-1,0);
Результат - 4,5,7
Хотя, может, все даты - январские?
4 окт 12, 17:33    [13269644]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку..  [new]
Cheerful Calf
Member

Откуда: Lithuania
Сообщений: 6994
Виноват, уточняю
Cheerful Calf
Из данной таблицы надо выбрать все записи, ВКЛЮЧИТЕЛЬНО начиная с последнего поля StartingDate, предшествующего сегодняшней дате.


>= - просто выберет даты из будущего
4 окт 12, 17:34    [13269651]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку..  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
Cheerful Calf
Виноват, уточняю
Cheerful Calf
Из данной таблицы надо выбрать все записи, ВКЛЮЧИТЕЛЬНО начиная с последнего поля StartingDate, предшествующего сегодняшней дате.


>= - просто выберет даты из будущего
Что означает "записи, начиная с последнего поля StartingDate"?
Как может запись начинаться с поля?
4 окт 12, 17:38    [13269680]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку..  [new]
Cheerful Calf
Member

Откуда: Lithuania
Сообщений: 6994
Ну не знаю как объяснить. Надо по такому принципу (только не столь тяжеловесное)

SELECT t.ID,
       t.ItemCodeID,
       t.SalesPriceWVAT,
       t.StartingDate
FROM   dbo.tempSalesPrice AS t
       INNER JOIN (
                SELECT TOP(100) PERCENT ItemCodeID,
                       MAX(StartingDate) AS LAST
                FROM   dbo.tempSalesPrice
                WHERE  (StartingDate <= GETDATE())
                GROUP BY
                       ItemCodeID
                ORDER BY
                       LAST DESC
            ) AS latests
            ON  t.StartingDate >= latests.Last
            AND t.ItemCodeID = latests.ItemCodeID
4 окт 12, 17:42    [13269721]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку..  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
Так что ли?
WITH Yesterday AS
(
 SELECT TOP(1) WITH TIES *
 FROM #tempSalesPrice
 WHERE StartingDate<DATEADD(DAY,DATEDIFF(DAY,0,CURRENT_TIMESTAMP),0)
 ORDER BY StartingDate DESC
)
SELECT *
FROM Yesterday
UNION ALL
SELECT *
FROM #tempSalesPrice
WHERE StartingDate>=DATEADD(DAY,DATEDIFF(DAY,0,CURRENT_TIMESTAMP),0);
4 окт 12, 17:45    [13269743]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку..  [new]
Glory
Member

Откуда:
Сообщений: 104760
Т.е. выбрать все ID, которые >= миниального ID, у которого StartingDate меньше текущей даты на 1 день ?
4 окт 12, 17:45    [13269746]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку..  [new]
Cheerful Calf
Member

Откуда: Lithuania
Сообщений: 6994
Glory,

ID не обязательно по порядку
надо все ID, у которых
StartingDate >= GETDATE() AND последний StartingDate до сегодня и не вовсе не обязательно вчера (если такой был)
4 окт 12, 17:49    [13269778]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку..  [new]
Cheerful Calf
Member

Откуда: Lithuania
Сообщений: 6994
Cheerful Calf
StartingDate >= GETDATE() AND последний StartingDate до сегодня и вовсе не обязательно вчера (если такой был)
4 окт 12, 17:50    [13269782]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку..  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
Cheerful Calf
Cheerful Calf
StartingDate >= GETDATE() AND последний StartingDate до сегодня и вовсе не обязательно вчера (если такой был)
Значит, я попал?
4 окт 12, 21:46    [13270577]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку..  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
SELECT *
FROM #tempSalesPrice T
WHERE T.StartingDate>=(SELECT MAX(TT.StartingDate) FROM #tempSalesPrice TT WHERE TT.StartingDate<DATEADD(DAY,DATEDIFF(DAY,0,CURRENT_TIMESTAMP),0));
5 окт 12, 09:44    [13271594]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку..  [new]
Cheerful Calf
Member

Откуда: Lithuania
Сообщений: 6994
iap,

почти.. но впрочем, это не намного легче моего..
5 окт 12, 12:05    [13272896]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку..  [new]
smallserg
Member

Откуда:
Сообщений: 82
Cheerful Calf,

select * from @tempSalesPrice where [StartingDate]>getdate()
union all
select * from
(select top 1 with ties * from @tempSalesPrice where [StartingDate]<getdate()
order by (row_number() over (partition by [ItemCodeID] order by [StartingDate] desc)) ) x


Так легче ? :)
9 окт 12, 14:23    [13290527]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить