当我还需要 select 时如何在 Substring 中使用 Select?
How to use Select in Substring when I need also select?
您好,我正在使用 WITH A AS... , B as ....
命令。但是,在 C 中,我需要从 B table 中的列中获取第一个值。尝试使用 ```select(substr(select Table1 来自 B,0,1)
但是我有一个错误。你能帮忙吗,我怎样才能在临时 tables 中提取第一个值?
I.E.数据是
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);
在 A table 中,我得到 3 个最近的日期。在 B 列中,我计算了 A 日期和今天之间的天数差异。但是数据还包括 hours/minutes。通过在 Table C 中使用子字符串,我想避免在 Table B.minutes/hours 中使用 minutes/hours。
我将数据类型从文本转换为字符串,只选择了 'yyyy-MM-dd' 然后将数据转换回文本,准备插入 table_c
我认为最好的做法是为您的列使用更合适的数据类型,因为这样可以更轻松地查询它们并保持数据更清晰。
SELECT CAST(LEFT(CAST(DATE AS nvarchar(18)),10) AS TEXT) AS [DATE], PRICE
INTO TABLE_C
FROM XXX
看起来您正在向关系数据库迈出第一步 - 欢迎来玩!
我更改了脚本以将 TRUNC()
表达式显式强制转换为 DATE 类型。
或者,您也可以使用函数 TIMESTAMPDIFF()
(例如 SQL 服务器中的 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
您好,我正在使用 WITH A AS... , B as ....
命令。但是,在 C 中,我需要从 B table 中的列中获取第一个值。尝试使用 ```select(substr(select Table1 来自 B,0,1)
但是我有一个错误。你能帮忙吗,我怎样才能在临时 tables 中提取第一个值?
I.E.数据是
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);
在 A table 中,我得到 3 个最近的日期。在 B 列中,我计算了 A 日期和今天之间的天数差异。但是数据还包括 hours/minutes。通过在 Table C 中使用子字符串,我想避免在 Table B.minutes/hours 中使用 minutes/hours。
我将数据类型从文本转换为字符串,只选择了 'yyyy-MM-dd' 然后将数据转换回文本,准备插入 table_c
我认为最好的做法是为您的列使用更合适的数据类型,因为这样可以更轻松地查询它们并保持数据更清晰。
SELECT CAST(LEFT(CAST(DATE AS nvarchar(18)),10) AS TEXT) AS [DATE], PRICE
INTO TABLE_C
FROM XXX
看起来您正在向关系数据库迈出第一步 - 欢迎来玩!
我更改了脚本以将 TRUNC()
表达式显式强制转换为 DATE 类型。
或者,您也可以使用函数 TIMESTAMPDIFF()
(例如 SQL 服务器中的 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