Rabee3-F1.787545 Ответов: 2

Выберите последний курс для каждой валюты


CREATE TABLE [dbo].[tbl_currencies](
	[currency_id] [int] IDENTITY(1,1) NOT NULL,
	[currency] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_tbl_currencies] PRIMARY KEY CLUSTERED 
(
	[currency_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO


currency_id	currency
1	                 LBP
2	                 USD
3	                 EUR


CREATE TABLE [dbo].[tbl_rate](
	[rate_id] [int] IDENTITY(1,1) NOT NULL,
	[currency_id] [int] NULL,
	[currency] [nvarchar](50) NULL,
	[time_stamp] [date] NULL,
	[rate] [decimal](18, 4) NULL
) ON [PRIMARY]
GO



rate_id currency_id курс время валюта
1 1 LBP 2018-01-01 1.0000
2 2 У. Е 2018-01-01 1500.0000
3 1 LBP 2019-01-01 1.0000
4 2 USD 2019-01-01 1057.5000

Что я уже пробовал:

Select c.currency_id,c.currency,r.rate,Max(r.time_stamp)  from tbl_currencies c 
inner join tbl_rate r on c.currency_id=r.currency_id 
group by c.currency_id,c.currency,r.rate


currency_id	currency	rate	(No column name)
1	                     LBP	1.0000	2019-01-01
2	                     USD	1057.5000	2019-01-01
2	                     USD	1500.0000	2018-01-01



Ther Correct Result that must i retrive is 
currency_id	            currency rate	       (No column name)
1	                     LBP	1.0000	        2019-01-01
2	                     USD	1057.5000	    2019-01-01

OriginalGriff

И что же?
У тебя был вопрос?

Это не очень хороший вопрос - мы не можем понять из этого малого, что вы пытаетесь сделать.
Помните, что мы не можем видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли - мы получаем только то, что вы печатаете для работы.
Используйте виджет "улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

Rabee3-F1.787545

Мне очень жаль и спасибо что уделили мне время
я внес изменения надеюсь теперь все ясно

Richard MacCutchan

Вы понимаете, что курсы валют постоянно колеблются? Вы должны получить свои курсы на авторитетном сайте онлайн-обмена валют, чтобы обеспечить точные расчеты.

Rabee3-F1.787545

Да конечно но это для того чтобы записать их и сохранить изменения в течение всего года

Richard MacCutchan

А как насчет тех, что меняются каждую секунду? Хранение этих значений-пустая трата времени, вам нужно получить значения в реальном времени от одного из сервисов обмена валюты или фондовых бирж, которые их предоставляют.

Rabee3-F1.787545

Мне нужно получить каждую валюту с последним курсом а не с последней записью Как означает первый ответ

Wendelius

Всякий раз, когда вам нужно связаться с человеком, который дал ответ, вы можете использовать кнопку комментария к конкретному решению. Таким образом, автор получает уведомление и знает, что нужно вернуться.

На ваш вопрос, как вы определяете последнюю ставку, если не по метке времени? Или вы имеете в виду, что вам нужны последние курсы для всех валют?

2 Ответов

Рейтинг:
9

Rabee3-F1.787545

alter procedure GetCurrency

as
begin 
delete from tbl_Temp_rate
Declare @MID nvarchar(50)
DECLARE MY_CURSOR CURSOR 
     LOCAL STATIC READ_ONLY FORWARD_ONLY
     FOR 
     select distinct(currency_id) from tbl_currencies

     OPEN MY_CURSOR
     FETCH NEXT FROM MY_CURSOR INTO @MID
     WHILE @@FETCH_STATUS = 0
       BEGIN 
      
	   --insert into  tbl_Temp_rate   Select top 1 currency,rate,time_stamp from tbl_rate  where currency_id=1 order by time_stamp desc 
      INSERT INTO [dbo].[tbl_Temp_rate] Select top 1 currency_id,currency,time_stamp,rate from tbl_rate  where currency_id=@MID order by time_stamp desc 

         FETCH NEXT FROM MY_CURSOR INTO @MID
        END
        CLOSE MY_CURSOR
        DEALLOCATE MY_CURSOR
Select currency_id,currency,rate,time_stamp from tbl_Temp_rate


End


CHill60

Это реальное решение или часть вашего вопроса?

Рейтинг:
0

Wendelius

Насколько я вижу, это тот же самый вопрос, что и Выберите последнюю запись в списке по дате[^]

Как уже было сказано, это похоже на домашнее задание, поэтому вы должны попытаться использовать пункты, описанные также в предыдущем ответе.

Таким образом, идея заключается в том, что для того, чтобы выбрать последнюю скорость, вам просто нужно отсортировать данные на основе столбца timestamp в порядке убывания с помощью Предложение ORDER BY (Transact-SQL) - SQL Server | Microsoft Docs[^] а затем, чтобы получить только одну запись, вы можете использовать TOP (Transact-SQL) - SQL Server | Microsoft Docs[^] .

Поскольку вам нужна только последняя запись, вам не нужно предложение GROUP BY и не нужен максимальный агрегат.

ДОПОЛНЕНИЕ

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

SELECT ...
FROM tbl_currencies c
WHERE NOT EXISTS (SELECT 1
                  FROM tbl_currencies c2
                  WHERE c2.Currency = c.Currency
                  AND   c2.time_stamp > c.time_stamp)


Wendelius

Ответ обновлен.