有没有办法标记SQL表中的连续数字?
基于“ value_group_4”列中的值,是否可以标记连续值?这需要在每个“ date_group_1”的组内完成
我尝试使用row_numbers,rank,densed_rank,但无法提出一种万无一失的方法。
答案 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_1
,value_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在线进行测试。