[我还需要选择时如何在子字符串中使用选择?

问题描述 投票:1回答:2

您好,我正在使用WITH A AS... , B as ....命令。但是,在C中,我需要从B表中的列中获取第一个值。试图使用```select(substr(从B,0,1中选择Table1)但是我有一个错误。您能帮我怎样在临时表中提取第一个值?

即数据是

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个最新日期。在B列中,我计算了A日期与今天之间的天数差异。但是,数据还包括小时/分钟。通过使用表C中的子字符串,我想避免表B中的分钟/小时。

sql vertica
2个回答
1
投票

看起来您正在迈入关系数据库的第一步-欢迎您玩得开心!

我更改了脚本,以将TRUNC()表达式明确地强制转换为DATE类型。

或者,您也可以使用函数TIMESTAMPDIFF()(例如,在SQL Server中为DATEDIFF())。

[不仅在Vertica中,而且在所有DBMS中都有,这些数据类型的数据类型和功能使您的生活变得非常轻松得多。

在下面的示例中,我对'2019-04-27 01:00'这样的文字使用正确的类型-这是没有几分之一秒的时间戳-TIMESTAMP(0)

您可以使用下面在函数TRUNC(the_timestamp)中获得时间戳的日期部分。

并且在大量的RDBMS-s中,您可以减去整个日期并获得整数作为差值-其中包括Vertica-我这样做。

选择最近的3个日期是选择日期,按降序排列,并将结果限制为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
投票

我将数据类型从文本转换为字符串,只选择了'yyyy-MM-dd',然后将数据覆盖回文本,准备插入table_c中

它认为,对列使用更合适的数据类型将是最佳做法,因为这将使查询起来变得更加容易并保持数据整洁。

SELECT CAST(LEFT(CAST(DATE AS nvarchar(18)),10) AS TEXT) AS [DATE], PRICE 
INTO TABLE_C
FROM XXX
© www.soinside.com 2019 - 2024. All rights reserved.