sql查询找到第三组中没有的内容

时间:2014-04-25 10:33:47

标签: sql sql-server sql-server-2008 sql-server-2012

我有一个SQL Table,其中有一些虚拟数据。 我想要那些虚拟数据并用column type

更新该行
my table tbl

ID  D1  M1  C1  QTY TYPE

1   D1  M1  C1  1   Y
2   D1  M2  C1  2   Y
3   D1  M3  C1  3   Y
4   D1  M1  C1  1   Y

5   D2  M1  C1  1   Y
6   D2  M2  C1  2   Y
7   D2  M3  C2  3   Y
8   D2  M1  C1  1   Y
9   D2  M2  C1  2   Y

10  D3  M1  C1  1   Y
11  D3  M2  C1  2   Y
12  D3  M3  C1  3   Y
13  D3  M1  C1  1   Y
14  D3  M2  C1  2   Y
15  D3  M3  C1  3   Y
16  D3  M1  C2  1   Y

对列D1M1

进行分组

我有N号。记录,现在我必须识别3个记录的组,如果有任何记录,那么它应该被设置为" No"别的"是" 例如:

条件1:如果我有4条记录,则制作一组3-3条记录,因此最后1条记录应设置为“#34; no"。

条件2:如果我有5条记录,那么制作一组3-3条记录,所以最后2条记录将被设置为"否"

条件3:如果我有7条记录,则制作一组3-3条记录,因此最后1条记录将被设置为"否"

我的预期答案如下

 ID D1  M1  C1  QTY TYPE

1   D1  M1  C1  1   YES
2   D1  M2  C1  2   YES
3   D1  M3  C1  3   YES
4   D1  M1  C1  1   NO

5   D2  M1  C1  1   YES
6   D2  M2  C1  2   YES
7   D2  M3  C2  3   YES
8   D2  M1  C1  1   NO
9   D2  M2  C1  2   NO

10  D3  M1  C1  1   YES
11  D3  M2  C1  2   YES
12  D3  M3  C1  3   YES
13  D3  M1  C1  1   YES
14  D3  M2  C1  2   YES
15  D3  M3  C1  3   YES
16  D3  M1  C2  1   NO

SQLFIDDLE

请告诉我解决方案。

1 个答案:

答案 0 :(得分:2)

这是你在找什么?

with toupdate as (
      select t.*, row_number() over (partition by d1 order by id) as seqnum,
             count(*) over (partition by d1) as cnt
      from tbl t
     )
update toupdate
    set type = (case when seqnum  <= 3*(cnt /3) then 'yes' else 'no' end);

您还可以运行与select

类似的逻辑
select t.*, (case when seqnum  <= 3*(cnt /3) then 'yes' else 'no' end)
from (
      select t.*, row_number() over (partition by d1 order by id) as seqnum,
             count(*) over (partition by d1) as cnt
      from tbl t
     ) t;