【问题标题】:Narrowing results in SQL在 SQL 中缩小结果
【发布时间】:2022-01-23 07:59:29
【问题描述】:

我已经在 SQL 中构建了一个查询,但我想进一步缩小结果范围,但不知道如何去做。不确定我是否需要使用 Case 语句?我使用 WITH 只是因为它更容易引用我使用 case 语句创建的新列。

这是我的代码:

WITH Analysis as (
SELECT
MPOINTNAME
,eff_date as MPEFFDATE
,end_date as MPENDDATE
,CASE
When `eff_date = '01-NOV-21' Then 'New detail'
when end_date = '01-OCT-21' Then 'Expired detail'
End detail
FROm Measurementpoint
GROUP BY MPOINTNAME, eff_date, end_date )

SELECT
a.mpointname
,a.mpeffdate
,a.mpenddate
,a.detail`
From Analysis a
order by a.mpointname

这是输出:

MPOINTNAME `MPEFFDATE `MPENDDATE `Detail`
11-15       01-NOV-21`  01-DEC-12`  New detail`
11-15       01-NOV-20   01-OCT-21` `Expired detail`
06-15       01-NOV-21   01-DEC-12   New detail`
03-15       01-NOV-21`  01-DEC-12`  New detail
03-15       01-NOV-20   01-OCT-21` `Expired detail`
07-15       01-NOV-21   01-DE-12C   New detail`

现在,我只想包含只有“新详细信息”的 MPOINTNAME。这告诉我它是全新的,而其他只是一个新细节,但他们有一个前一个月过期的细节。我不知道如何获得这些结果。基本上我只想显示两行,第三行和最后一行。我们的系统将新详细信息的结束日期默认为 2012 年 12 月 1 日。 谢谢 马克

`

【问题讨论】:

  • 首先,使用字符串常量对于未来的工作来说是一种非常(非常)糟糕的方式,但除此之外:如果我是正确的,你只希望 06-15 和 07-15 出现(来自您提到的列表)作为“新细节”对吗?

标签: sql


【解决方案1】:

你并没有真正回答我的评论,所以这是假设(假设是..),但我假设你想要上面提到的列表中的 06-15 和 07-15。

你已经有一个 CTE : Analysis ,这将使事情变得更容易。你想要的是一个 ID 的选择不在子选择中;像这样:

SELECT * FROM Analysis 
WHERE MPOINTNAME NOT IN 
    (SELECT MPOINTNAME FROM Analysis WHERE Detail = 'Expired detail')

使用 * 作为一个简单的选择,在那里做任何你想做的事情。但是您可以多次使用此 CTE,因此您也可以使用它来查询您不想要的“ID”(或本例中的“MPOINTNAME”)。

话虽如此 - 使用像“eff_date = '01-NOV-21'”这样的字符串文字真的让我很吃力,如果这是一个日期,你可以使用不同的(面向未来的)格式 - 但这取决于你。

【讨论】:

  • 如果这确实回答了您的问题,请为其他人标记为已解决。
  • 谢谢!那行得通。我也很欣赏关于字符串文字的建议。我是新手,所以所有的建议都值得赞赏。
猜你喜欢
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多