#c #sql #database #data-manipulation
Вопрос:
Я хочу получить некоторые данные о близких запасах и сравнить их с двумя выбранными мной датами. Например, если я хочу увидеть изменение цены акций от 1/1/20
и 1/1/21
, я бы хотел, чтобы он просмотрел все акции, перечисленные в списке, и вернул мне сравнение цен за эти два дня. Сравнение-это изменение закрытия, процентное изменение, закрытие в предыдущий день, закрытие в последний день, время последнего дня (или, по крайней мере, это данные, которые я хочу извлечь из базы данных).
В настоящее время то, что мне нужно, чтобы это сработало, — это запрос
"SELECT Code, Close, Date FROM StockData WHERE DateInSeconds = " from " OR DateInSeconds = " to " ORDER BY Code ASC, DateInSeconds";
Code is the code name for a company
Close is the close price
Date is the formatted date (in a string) 'dd-mm-yyyy'
DateInSeconds is the timestamp for that date so that I can sort by it
from is the timestamp for the first date
to is the timestamp for the second date
это загружает закрытия для дня 1 и дня 2, а затем моя программа на C перебирает массив закрываний и проверяет, является ли следующий элемент тем же кодом (потому что он может пропустить даты или быть устаревшим), и если да, выполните сравнение. Это довольно неэффективно, потому что я копирую данные в массив, а затем манипулирую ими и копирую их в другой массив, тогда как я бы просто предпочел, чтобы запрос отправлял правильные данные, чтобы избежать этого.
Примером таблицы может быть
Code Date Close DateInSeconds
ASX 01-01-2000 1.00 946645200
ASX 02-01-2000 1.10 946731600
.
.
ASX 02-07-2021 50.00 1625148000
.
.
ANZ 01-01-2000 1.00 946645200
.
.
с некоторыми фиктивными близкими значениями.
И пример вывода с датами (Date, Close: { 01-01-2021, 100 }, { 02-01-2021, 150 })
(хранится в массиве в программе)
Code CloseChange CloseChangePercent Previous Last Date
ASX 50.00 50.00% 100.00 150.00 02-01-2021
.
Company 2...
Company 3...
.
.
Ответ №1:
Если вы хотите объединить 2 строки ввода в 1 строку вывода, вы можете сделать это с помощью соединения:
SELECT
sdfrom.Code,
sdfrom.DateInSeconds as FromDate,
sdfrom.Close as FromClose,
sdto.DateInSeconds as ToDate,
sdto.Close as ToClose
FROM StockData sdfrom
INNER JOIN StockData sdto ON (sdfrom.Code = sdto.Code AND sdto.DateInSeconds = @toDate)
WHERE sdfrom.DateInSeconds = @fromDate
Это внутреннее соединение, поэтому записи » от » и » до » должны существовать.
Комментарии:
1. Меня немного смущает это заявление,
sdfrom
дата? В моем примереStockData
это таблица. И что это даст после присоединения?2. sdfrom-это псевдоним таблицы. Запрос соединяет данные о запасах с самим собой, поэтому я создал 2 псевдонима таблиц: sdfrom (данные о запасах от) и sdto (данные о запасах до). Он выведет 5 столбцов: «Код», «Дата» — это псевдоним для sdfrom. Секунды времени и так далее
3. Почему это так умно, это даже работает для пропущенных значений :DDDD потрясающе!!!
4. Хотел бы я взять на себя ответственность за изобретение SQL. 🙂