Как использовать Select в Substring, когда мне также нужно выбрать? - PullRequest
1 голос
/ 24 апреля 2020

Здравствуйте, я использую WITH A AS... , B as .... команды. Однако в C мне нужно было взять первое значение из столбца в таблице B. Пытался использовать `` `select (substr (select Table1 from B, 0,1). Однако у меня возникла ошибка. Можете ли вы помочь, как мне извлечь первое значение из временных таблиц?

IE данные

CREATE temp TABLE XXX (DATE TEXT, PRICE INTEGER);
INSERT INTO XXX VALUES 
('2019-04-27 01:00', 1), ('2019-04-27 02:30', 3), ('2019-04-27 18:00',2), 
('2019-04-28 17:00', 2), ('2019-04-28 21:00', 5), 
('2019-04-29 17:00',50), ('2019-04-29 21:00',10), 
('2019-04-30 17:00',10), ('2019-04-30 21:00',20), 
('2019-05-01 17:00',40), ('2019-05-01 21:00',10), 
('2019-05-02 17:00',10), ('2019-05-02 21:00', 6);

В таблице «А» я получаю наибольшее число дат 3. В столбце «В» я рассчитал разницу в днях между датами «А» и «Сегодня». Однако данные также включают часы / минуты. Используя подстроку в таблице C I хотел избежать минут / часов в таблице B.

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Похоже, вы делаете свои первые шаги в реляционной базе данных - добро пожаловать в самое интересное!

Я изменил скрипт для явного приведения выражения TRUNC() к типу DATE в явном виде.

В качестве альтернативы вы также можете использовать функцию TIMESTAMPDIFF() (например, DATEDIFF() на SQL сервере).

У нас есть - не только в Vertica, но и во всех СУБД данные типы и функции для тех типов данных, которые значительно упрощают вашу жизнь.

В приведенном ниже примере я использую правильный тип для литерала, подобного '2019-04-27 01:00', который представляет собой метку времени без доли секунд, а TIMESTAMP(0).

Вы можете получить часть даты временной метки с помощью функции TRUNC(the_timestamp), которую я использую ниже.

И в большом количестве RDBMS-ов вы можете вычесть целое даты и получают целые числа как разницу - среди которых Vertica - что я и делаю.

Выбор трех самых последних дат - это выбор даты, упорядочение по убыванию и ограничение результата до 3 строк.

Посмотрите, что я делаю здесь ниже ...

CREATE LOCAL TEMPORARY TABLE xxx(dt, price) 
ON COMMIT PRESERVE ROWS AS (
          SELECT TIMESTAMP '2019-04-27 01:00', 1
UNION ALL SELECT TIMESTAMP '2019-04-27 02:30', 3
UNION ALL SELECT TIMESTAMP '2019-04-27 18:00', 2
UNION ALL SELECT TIMESTAMP '2019-04-28 17:00', 2
UNION ALL SELECT TIMESTAMP '2019-04-28 21:00', 5
UNION ALL SELECT TIMESTAMP '2019-04-29 17:00',50
UNION ALL SELECT TIMESTAMP '2019-04-29 21:00',10
UNION ALL SELECT TIMESTAMP '2019-04-30 17:00',10
UNION ALL SELECT TIMESTAMP '2019-04-30 21:00',20
UNION ALL SELECT TIMESTAMP '2019-05-01 17:00',40
UNION ALL SELECT TIMESTAMP '2019-05-01 21:00',10
UNION ALL SELECT TIMESTAMP '2019-05-02 17:00',10
UNION ALL SELECT TIMESTAMP '2019-05-02 21:00', 6
)
;

-- GET THE 3 MOST RECENT DATES ...
SELECT
  dt
FROM xxx ORDER BY dt DESC
LIMIT 3
;
-- out          dt          
-- out ---------------------
-- out  2019-05-02 21:00:00
-- out  2019-05-02 17:00:00
-- out  2019-05-01 21:00:00

-- CALCULATE DIFFERENCE IN DAYS BETWEEN THE DATE AND TODAY ..
SELECT
  *
, CURRENT_DATE - TRUNC(dt)::DATE AS daydiff_to_today
, TIMESTAMPDIFF(DAY,TRUNC(dt), CURRENT_DATE) AS daydiff_timestampdiff
FROM xxx
ORDER BY 1;
-- out          dt          | price | daydiff_to_today | daydiff_timestampdiff 
-- out ---------------------+-------+------------------+-----------------------
-- out  2019-04-27 01:00:00 |     1 |              366 |                   366
-- out  2019-04-27 02:30:00 |     3 |              366 |                   366
-- out  2019-04-27 18:00:00 |     2 |              366 |                   366
-- out  2019-04-28 17:00:00 |     2 |              365 |                   365
-- out  2019-04-28 21:00:00 |     5 |              365 |                   365
-- out  2019-04-29 17:00:00 |    50 |              364 |                   364
-- out  2019-04-29 21:00:00 |    10 |              364 |                   364
-- out  2019-04-30 17:00:00 |    10 |              363 |                   363
-- out  2019-04-30 21:00:00 |    20 |              363 |                   363
-- out  2019-05-01 17:00:00 |    40 |              362 |                   362
-- out  2019-05-01 21:00:00 |    10 |              362 |                   362
-- out  2019-05-02 17:00:00 |    10 |              361 |                   361
-- out  2019-05-02 21:00:00 |     6 |              361 |                   361

1 голос
/ 24 апреля 2020

Я преобразовал тип данных из текста в строку, только выбрал 'yyyy-MM-dd', затем преобразовал данные обратно в текст, готовый для вставки в таблицу_ c

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

SELECT CAST(LEFT(CAST(DATE AS nvarchar(18)),10) AS TEXT) AS [DATE], PRICE 
INTO TABLE_C
FROM XXX
...