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

Откуда:
Сообщений: 8
Дано:
Входной параметр @Date – дата без времени и
таблица tRate (котировки валют) с полями
Date_Time - Дата котировки (в формате дата + время)
Fund - Код валюты
Course - Котировка

Требуется написать select, который на указанную дату @Date будет выдавать для каждой валюты ее действующую котировку

Пример:

при наличии в таблице tRate данных

Date_Time                     Fund               Course

20.05.2007 10:00 USD 25.5

20.05.2007 10:00 EUR 35.6

21.05.2007 10:00 USD 25.4

21.05.2007 18:00 USD 25.8

21.05.2007 10:00 UAH 100.0

22.05.2007 10:00 UAH 103.2

22.05.2007 10:00 USD 26.0

22.05.2007 10:00 EUR 35.4

При @Date = '21.05.2007’ select должен выдать результат:

Валюта            Котировка

USD 25.8

EUR 35.6

UAH 100.0

Решение с partition over:

SELECT DISTINCT Fund,
FIRST_VALUE(Course) OVER (PARTITION BY Fund
ORDER BY Date_Time DESC)
FROM Currency
WHERE Date_Time < DATEADD(day, 1, @Date)

Подскажите как обойтись без partition over в данной задаче. Спасибо!
27 ноя 19, 20:31    [22027014]     Ответить | Цитировать Сообщить модератору
 Re: Помогите настроить фильтрацию по таблице  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36687
Чем не угодил partition over ?
27 ноя 19, 20:42    [22027018]     Ответить | Цитировать Сообщить модератору
 Re: Помогите настроить фильтрацию по таблице  [new]
Sadmann
Member

Откуда:
Сообщений: 8
Один из диалектов это не поддерживает
27 ноя 19, 20:43    [22027021]     Ответить | Цитировать Сообщить модератору
 Re: Помогите настроить фильтрацию по таблице  [new]
Remind
Member

Откуда: UK
Сообщений: 523
with cte as
(
  select fund, max(date_time) as MaxDateTime
  from Currency
  where date_time < dateadd(day, 1, @date)
  group by fund
)
select c.*
from Currency c
  join cte
    on cte.fund = c.fund
    and cte.MaxDateTime = c.date_time


Сообщение было отредактировано: 27 ноя 19, 20:59
27 ноя 19, 20:56    [22027024]     Ответить | Цитировать Сообщить модератору
 Re: Помогите настроить фильтрацию по таблице  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36687
Sadmann,

Тогда задайте вопрос в соответствующем разделе.
27 ноя 19, 20:58    [22027025]     Ответить | Цитировать Сообщить модератору
 Re: Помогите настроить фильтрацию по таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
Sadmann,

set language Russian;

declare @t table (Date_Time datetime, Fund varchar(10), Course numeric(18,2));

insert into @t
values
('20.05.2007 10:00', 'USD', 25.5),
('20.05.2007 10:00', 'EUR', 35.6),
('21.05.2007 10:00', 'USD', 25.4),
('21.05.2007 18:00', 'USD', 25.8),
('21.05.2007 10:00', 'UAH', 100.0),
('22.05.2007 10:00', 'UAH', 103.2),
('22.05.2007 10:00', 'USD', 26.0),
('22.05.2007 10:00', 'EUR', 35.4);

declare @date date = '20070521';

select
 a.*
from
 @t a
where
 a.Date_Time <= @date and
 not exists(select 1 from @t where Course = a.Course and a.Date_Time > a.Date_Time);
27 ноя 19, 23:10    [22027087]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить