SQL-识别表格中的连续数字

时间:2019-03-08 17:07:08

标签: sql sql-server

有没有办法标记SQL表中的连续数字?

基于“ value_group_4”列中的值,是否可以标记连续值?这需要在每个“ date_group_1”的组内完成

我尝试使用row_numbers,rank,densed_rank,但无法提出一种万无一失的方法。

enter image description here

4 个答案:

答案 0 :(得分:0)

这与连续性无关。您只想标记date_group_1和value_group_4不唯一的所有行。

一种方法:

select
  mytable.*,
  case when exists
  (
    select null
    from mytable agg
    where agg.date_group_1 = mytable.date_group_1
    and agg.value_group_4 = mytable.value_group_4
    group by agg.date_group_1, agg.value_group_4
    having count(*) > 1
  ) then 1 else 0 end as flag
from mytable
order by date_group_1, value_group_4;

在更高版本的SQL Server中,您将改为使用COUNT OVER

答案 1 :(得分:0)

如果您的SLQ Server版本没有完整的窗口功能套件,则应该仍然可以。这个问题看起来像是最后一个非空问题,Itzik Ben-Gan在这里有个很好的例子... http://www.itprotoday.com/software-development/last-non-null-puzzle

另外,看看Mikael Eriksson的答案here,该答案不使用窗口功能。

答案 2 :(得分:0)

SQL表表示无序集。除非有列指定顺序,否则没有连续值之类的东西。您的数据没有如此明显的列,但我假设其中存在一个,为方便起见,将其称为id

使用这样的列,lag() / lead()可以满足您的需求:

select t.*,
       (case when lag(value_group_4) over (partition by data_group1 order by id) = value_group_4
             then 1
             when lead(value_group_4) over (partition by data_group1 order by id) = value_group_4
             then 1
             else 0
         end) as flag
from t;

仔细检查,value_group_3可能会做您想要的事情。因此,您可以将其用于id

答案 3 :(得分:0)

如果数据的顺序由date_group_1value_group_3列值确定,那么为什么不像下面的查询那样使它简单:

select
  *,
  rank() over(partition by date_group_1 order by value_group_3) - 1 value_group_3,
  case
    when count(*) over(partition by date_group_1, value_group_3) > 1 then 1
    else 0
  end expected_result
from data;

输出:

| date_group_1 | category_group_2 | value_group_3 | value_group_3 | expected_result |
+--------------+------------------+---------------+---------------+-----------------+
| 2018-01-11   | A                | 15.3          |             0 |               0 |
| 2018-01-11   | B                | 17.3          |             1 |               1 |
| 2018-01-11   | A                | 17.3          |             1 |               1 |
| 2018-01-11   | B                | 21            |             3 |               0 |
| 2018-01-22   | A                | 15.3          |             0 |               0 |
| 2018-01-22   | B                | 17.3          |             1 |               0 |
| 2018-01-22   | A                | 21            |             2 |               0 |
| 2018-01-22   | B                | 23            |             3 |               0 |
| 2018-03-13   | A                | 15.3          |             0 |               0 |
| 2018-03-13   | B                | 17.3          |             1 |               1 |
| 2018-03-13   | A                | 17.3          |             1 |               1 |
| 2018-03-13   | B                | 23            |             3 |               0 |
| 2018-05-15   | A                | 6             |             0 |               0 |
| 2018-05-15   | B                | 6.3           |             1 |               0 |
| 2018-05-15   | A                | 15            |             2 |               0 |
| 2018-05-15   | B                | 16.3          |             3 |               1 |
| 2018-05-15   | A                | 16.3          |             3 |               1 |
| 2018-05-15   | B                | 22            |             5 |               0 |
| 2019-05-04   | A                | 0             |             0 |               0 |
| 2019-05-04   | B                | 7             |             1 |               0 |
| 2019-05-04   | A                | 15.3          |             2 |               0 |
| 2019-05-04   | B                | 17.3          |             3 |               0 |

使用SQL Fiddle在线进行测试。