根据更改的数据值创建交替的0和1值

时间:2014-07-04 07:17:20

标签: sql

我的sql数据库中有数据,需要创建changeControl值。

data   changeControl
M-0101  0
M-0101  0
M-02    1
M-03    0
OT-014  1
OT-014  1
M-228   0
M-228   0

有没有办法根据数据创建这个changeControl值?

4 个答案:

答案 0 :(得分:3)

有一种简单的方法,但这取决于您的数据库。

在SQL Server和Oracle中,您可以使用DENSE_RANK()来获取值的顺序,使用相同值的相同数字

在SQL Server中

SELECT data
     , (DENSE_RANK() OVER (ORDER BY data) - 1) % 2 changeControl
FROM   Table1

在Oracle中,%不存在,我们需要使用函数MOD()

SELECT data
     , MOD((DENSE_RANK() OVER (ORDER BY data) - 1), 2) changeControl
FROM   Table1

在MySQL中没有DENSE_RANK,但还有另一种方法可以获得结果

SELECT data, changeControl
FROM   (SELECT @last
             , data
             , @id := CASE WHEN @last <> data THEN 1 - @id 
                           WHEN @last = data THEN @id 
                           ELSE 0 
                      END changeControl
             , @last:= data
        FROM   Table1
             , (SELECT @id := 0) a) b

如果您不介意其他列,则可以直接运行子查询。

p.s。:如果你没有指定你正在使用的数据库,我们必须猜测。

答案 1 :(得分:1)

您需要先将数据分组,然后为每个组分配一个数字。 然后将此信息与主表连接,按数据排序,并从组号中取两个模数 - 这将是您的changeControl列。

select tn.*, t.RN % 2 as changeControl from tableName tn
left join 
(select ROW_NUMBER() OVER (ORDER BY data) AS RN, data
from tableName group by data) t
on t.data = tn.data
order by tn.data

这个问题不能通过两个id或数据散列模数来解决 - 即使相同的值也会改变id,两个连续的散列虽然可能不同,但都可以是偶数,产生相同的变化控制&#39 ;值。

答案 2 :(得分:0)

您可以根据id为奇数甚至

的位置为更改控制列创建替换0和1值
SELECT id , data ,
       CASE WHEN id%2=0 THEN 1 ELSE 0 END as changecontrol
FROM tableName

修改

SELECT id , data ,
      CASE WHEN 
               RIGHT(data,LEN(data) - CHARINDEX('-',data)) % 2 = 0 
           THEN 1 
           ELSE 0 END as changecontrol
FROM tableName

答案 3 :(得分:0)

要实现这一点,您应该处理GridView的RowStyle事件。以下是一些示例代码:

using DevExpress.XtraGrid.Views.Grid;

private void gridView1_RowStyle(object sender, 
DevExpress.XtraGrid.Views.Grid.RowStyleEventArgs e) {
   GridView View = sender as GridView;
   if(e.RowHandle >= 0) {
      int changeControl = Convert.ToInt32(View.GetRowCellValue(e.RowHandle, View.Columns["changeControl"]));
      if(changeControl == 1) {
         e.Appearance.BackColor = Color.Salmon;
      }            
      else
         e.Appearance.BackColor = Color.SeaShell;
   }
}

请同时查看此示例:

How to change a row style based on a column value