【问题标题】:SQL equivalent of countif() across 2 columnsSQL 等效于 2 列的 countif()
【发布时间】:2013-10-03 11:47:48
【问题描述】:

我知道有一个与此标题相同的问题,但我不确定它是否解决了我的问题。

我的数据如下所示:

ID     Current    Nxt  
1      1A          1B
1      1B          1C
2      2A          2B
3      3A          3B
3      3B

在 Excel 中使用 countif '=COUNTIF($B$2:$B$6,C2)' 我可以让数据看起来像这样(公式在发生的列中):

ID     Current    Nxt  Occurred
1      1A          1B  1 
1      1B          1C  0 
2      2A          2B  0
3      3A          3B  1 
3      3B              0 

基本上,我只想指出 Nxt 预定事件是否实际发生(如果它存在于数据中,则表明它)。

但是,我想在我的 SQL 查询中复制它,如下所示:

SELECT
ID,
Current,
Nxt

FROM
Table

我认为答案可能在于这样做:

sum(case when Current='1B' THEN 1 ELSE 0 END) over (partition by Current)

这里建议:Sql Server equivalent of a COUNTIF aggregate function。以上适用于一条记录,但问题是我需要使标准引用 Nxt 列的内容,而不是对其进行硬编码,因为以下内容不起作用:

sum(case when Current=Nxt THEN 1 ELSE 0 END) over (partition by Current)

我猜这是因为 Current 和 Nxt 实际上从来没有连续匹配过?

作为参考,我的数据库使用 Oracle 11。

【问题讨论】:

  • 您的数据库看起来像一个伪装成关系数据库的网络数据库。你被这个数据结构困住了吗?如果是这样,您可以期望处理数据网络模型的所有缺点,同时支付与关系数据相关的所有成本。早在 1980 年代,我就看到过这样的数据结构,当时关系数据库是新事物,但我已经有 15 年没有看到它们了。
  • 您的预期输出是什么?带有Occured = 1的行?
  • @WalterMitty - 抱歉,我不确定我是否理解这个问题。我只是一个报告作者,而不是数据库管理员。
  • @Rachcha - 是的,如果没有解释清楚,我们深表歉意。
  • 那么我已经提供了我的答案。应该够了。

标签: sql oracle count


【解决方案1】:

试试这个:

SELECT id
      ,current
      ,nxt
      ,nvl2(nxt,decode(next,lead(current) over (partition by id order by id),1,0),0) occured
  FROM yourtable

【讨论】:

  • 这似乎有效,但我不太确定我是否理解如何!我熟悉您使用过的所有功能,但我从未想过要使用它们(尽管我确实认为领先或滞后会在某个地方出现)。非常感谢您的及时回复!
【解决方案2】:

我建议您执行以下操作:

SELECT id, current, nxt
  FROM (SELECT id, current, nxt,
               CASE lead(current)
                       over (partition by id order by id)
                  WHEN nxt THEN 1
                  ELSE 0
               END AS occured
          FROM myTable)
 WHERE occured = 1;

编辑:

Fiddle Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2011-03-03
    • 1970-01-01
    相关资源
    最近更新 更多