我的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值?
答案 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;
}
}
请同时查看此示例: