【问题标题】:How to use Select in Substring when I need also select?当我还需要选择时如何在子字符串中使用选择?
【发布时间】:2020-04-24 10:57:07
【问题描述】:

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

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);

在一张表中,我得到了 3 个最近的日期。在 B 列中,我计算了 A 日期和今天之间的天数差异。然而,数据还包括小时/分钟。通过在表 C 中使用子字符串,我想避免表 B 中的分钟/小时。

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。 “B 表中列的第一个值”是什么意思?
  • @GordonLinoff 我添加了描述。谢谢
  • DATE 列具有 TEXT 数据类型而不是日期/日期时间数据类型是否有原因?
  • @KMoe 不,没有理由。以为它是一个字符串,但如果 SQL 有数据时间类型,那么我应该使用它

标签: sql vertica


【解决方案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

【讨论】:

  • 感谢您的回答。但是,我将 daydiff 变量设置为 364 00:00:00,但我需要没有小时/分钟/秒标记。如何实现?
  • TRUNC() 表达式转换为 date 。我会相应地改变我的答案......
【解决方案2】:

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

它认为最佳做法是为您的列使用更合适的数据类型,因为这样可以更轻松地查询它们并保持数据更清晰。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 2018-03-14
    • 2015-07-08
    • 2017-11-01
    相关资源
    最近更新 更多