SQL查询在1之后标识0

时间:2015-03-09 19:41:16

标签: sql teradata

我们说我有两列:日期指标

通常指标从0变为1 (当数据按日期排序时)和我希望能够识别它是否从1变为0 。使用SQL有一种简单的方法吗?

我已经在同一个表中聚合了其他字段。如果我可以将其添加为另一个聚合(例如,不使用单独的"其中"语句或第二次传递数据),那将非常棒。

这是我想要捕捉的现象:

Date      Indicator
1/5/01    0
1/4/01    0
1/3/01    1
1/2/01    1
1/1/01    0

3 个答案:

答案 0 :(得分:2)

这不是teradata特定的答案,但可以在普通的SQL中完成。

假设序列已经'完成'并且x n + 1 可以从x n 派生,例如当日期是连续的并且全部存在时:< / p>

SELECT date -- the 1 on the day following the 0
FROM r curr
JOIN r prev
-- join each day with the previous day
ON curr.date = dateadd(d, 1, prev.date)
WHERE curr.indicator = 1
  AND prev.indicator = 0

YMMV关于这种查询有效使用索引的能力。

  • 如果序列不完整,可以在制作一个秩序良好且类似“完整”的委托序列后应用相同的序列。

  • 这也可以使用correlated subqueries完成,每个都选择“之前最大值”的指标,但是......呃。

答案 1 :(得分:2)

将表连接到它自己它非常通用,但大多数SQL方言现在支持分析功能。理想情况下,您可以使用LAG(),但TeraData似乎尝试支持绝对最小值,因此他们指出您使用SUM()rows preceding结合使用。

无论如何,这种方法避免了潜在的高成本加入,有效地处理了数据中的空白,同时最大限度地利用了索引。

SELECT
  *
FROM
  yourTable   t
QUALIFY
  t.indicator
  <
  SUM(t.indicator) OVER (PARTITION BY t.somecolumn /* optional */
                             ORDER BY t.Date
                         ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING
                        )

QUALIFY有点TeraData特定,但比替代品稍微整洁......

SELECT
  *
FROM
(
  SELECT
    *,
    SUM(t.indicator) OVER (PARTITION BY t.somecolumn /* optional */
                               ORDER BY t.Date
                           ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING
                          )
                            AS previous_indicator
  FROM
    yourTable   t
)
  lagged
WHERE
  lagged.indicator < lagged.previous_indicator

答案 2 :(得分:1)

假设您的意思是要确定1值为indicator的任何行是否具有早于Date的行,而不是其0组中的行为indicator SELECT ... MAX(CASE indicator WHEN 0 THEN Date END) AS last_ind_0, MIN(CASE indicator WHEN 1 THEN Date END) AS first_ind_1, ... 值,您可以通过在汇总结果中包含适当的极端日期来识别具有该特征的组:

first_ind_1

然后,您可以在代码中或作为其他选择项来测试last_ind_0是否小于{{1}}。