SQL Select с условными данными для следующей строки

#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. 🙂