sql - 我需要从表中已检索到的列中检索一列
问题描述
我有一个表,它有一个这样的列,我从这个查询中检索到
select distinct HDD_WP_RPTNG_AS_OF_SID
from wcadbo.WCA_MDW_D_HLDNGS_DATE
order by HDD_WP_RPTNG_AS_OF_SID desc;
桌子:
HDD_WP_RPTNG_AS_OF_SID
20210501
20210430
20210429
20210428
它包含整数格式的日期。
我写了一个查询以日期格式检索这些日期的另一列,并将列命名为AS_OF_DATE
- 如下所示:
SELECT DISTINCT
HDD_WP_RPTNG_AS_OF_SID,
to_date(HDD_WP_RPTNG_AS_OF_SID,'YYYYMMDD') AS_OF_DATE
FROM
WCADBO.WCA_MDW_D_HLDNGS_DATE
ORDER BY
HDD_WP_RPTNG_AS_OF_SID DESC;
结果集:
HDD_WP_RPTNG_AS_OF_SID AS_OF_DATE
----------------------------------
20210501 01-MAY-21
20210430 30-APR-21
20210429 29-APR-21
20210428 28-APR-21
现在我需要另一列作为 char 类型的 Display_Date,它为上一列中的最新日期提供 LastAvailableDate,或者为所有其他日期提供 char 类型的 Date
我写了这个查询但没有工作:
SELECT
HDD_WP_RPTNG_AS_OF_SID,
AS_OF_DATE,
Display_date
FROM
(SELECT DISTINCT
HDD_WP_RPTNG_AS_OF_SID,
to_date(HDD_WP_RPTNG_AS_OF_SID,'YYYYMMDD') AS_OF_DATE
FROM
WCADBO.WCA_MDW_D_HLDNGS_DATE
ORDER BY
HDD_WP_RPTNG_AS_OF_SID DESC)
WHERE
Display_Date = (CASE
WHEN AS_OF_DATE = '01-MAY-21'
THEN 'Last_Available_date'
ELSE TO_CHAR(AS_OF_DATE, 'MON DD YYYY')
END);
最后我需要三列,一列已经在表中,但做了一些修改。其他两个是我需要检索的临时的(AS_OF_DATE 和 Display_Date)。
我是 SQL 的初学者,不知道如何从另一个临时列中检索列..
请帮忙,谢谢。
顺便说一句,我是在 Oracle SQL Developer 中做的
解决方案
看起来你想要这样的东西
SELECT
subQ.HDD_WP_RPTNG_AS_OF_SID,
subQ.AS_OF_DATE,
(CASE
WHEN subQ.AS_OF_DATE = date '2021-05-01'
THEN 'Last_Available_date'
ELSE TO_CHAR(subQ.AS_OF_DATE, 'MON DD YYYY')
END) Display_date
FROM
(SELECT DISTINCT
tbl.HDD_WP_RPTNG_AS_OF_SID,
to_date(tbl.HDD_WP_RPTNG_AS_OF_SID,'YYYYMMDD') AS_OF_DATE
FROM
WCADBO.WCA_MDW_D_HLDNGS_DATE tbl) subQ
ORDER BY
subQ.HDD_WP_RPTNG_AS_OF_SID DESC
注释
- 如果要添加计算列,则在投影(
select
列表)中完成 - 始终将日期与日期进行比较,将字符串与字符串进行比较。因此,在您的
case
声明中,将date
as_of_date
日期与另一个日期进行比较。在这种情况下,我使用的是日期文字。您还可以调用to_date
字符串参数。 - 如果您希望查询结果按特定列排序,则希望将其
order by
应用于查询的最外层,而不是在内联视图中。 - 在引用查询中的任何列时,您基本上总是希望使用别名。在所有内容都来自一个表的情况下,它的重要性不那么重要,但是一旦您开始在查询中引用多个表,查看查询并且不确定列的来源会变得很烦人。即使在这样的查询中,有一个内联视图和一个外部查询,如果您明确说明列的来源,它也可以更容易地阅读查询。
- 你真的需要
distinct
吗?我保留了它,因为它是原始查询的一部分,但每当我看到distinct
学习 SQL 的人的特别之处时,我都会感到不安。执行 adistinct
是一项相对昂贵的操作,它通常用于掩盖查询中的潜在问题(即您得到多行,因为您未显示的其他列具有多个值)应该正确解决(即通过添加一个额外的谓词来确保你只得到hdd_wp_rptg_as_of_sid
一次)。 - 将日期作为字符串存储在表格中(显然是用 来完成的
hdd_wp_rptg_as_of_sid
)是一种非常糟糕的做法。例如,如果有人在字符串格式不正确的表中写入一行,您的查询将突然停止工作并开始抛出错误。
推荐阅读
- javascript - 如何扁平化 promise.all 响应
- python - 如何在大量数据框列上应用我的 single_space 函数?
- android - 无法在 ionic 3 中的 Android 9 上点击以编辑离子输入
- java - Spring data jpa LIKE 查询最后不能使用空间?
- java - 迁移后 Hibernate 抛出错误(同一集合上的引用)
- python - 在电子商务数据集python上计算会话持续时间
- android - java.lang.NoClassDefFoundError:解析失败:Landroid/telephony/data/ApnSetting$Builder;
- c# - 使用带有列的 treeView 进行控制
- visual-studio - BizTalk 将字段映射到序列
- matlab - Matlab中的极坐标图