我遇到最小值问题。在下表中,d1,d2,d3值是最小值。当使用SQL min()或least()函数时,它总是会导致left side first
(也许我错了)在这里意味着d1
列。
我的问题是:是否有可能在d1,d2或d3中随机设置
least value or least column
。我想在这里说,对于每个执行时间,在值相同的情况下会更改least_column。
表formal
id date name d1 d2 d3 d4 least_value least_column
1 2017-02-10T09:00:00Z bimal 1 1 1 4 1 d1
select f.*,
(case ff.least_column
when 'd1' then d1
when 'd2' then d2
when 'd3' then d3
when 'd4' then d4
end) as least_value,
ff.least_column
from formal f cross join
(select least(d1, d2, d3, d4) as least_value,
(case least(d1, d2, d3, d4)
when d1 then 'd1'
when d2 then 'd2'
when d3 then 'd3'
when d4 then 'd4'
end) as least_column
from formal
) ff;
答案 0 :(得分:2)
您依赖的是一种限制随机化能力的小排结构。我建议你" unpivot"产生更多行的数据然后你可以获得更随机的结果。注意order by rand()
适用于小型结果集/表,但不适用于大型集。
您需要访问此SQL Fiddle并点击“运行”以查看任何"随机性"
CREATE TABLE formal
(`id` int, `date` datetime, `name` varchar(5), `d1` int, `d2` int, `d3` int, `d4` int)
;
INSERT INTO formal
(`id`, `date`, `name`, `d1`, `d2`, `d3`, `d4`)
VALUES
(1, '2017-02-10 09:00:00', 'bimal', 1, 1, 1, 1);
查询1 :
select
*
from (
select id, date, name, d1 colvalue, 'd1' colsource from formal union all
select id, date, name, d2 , 'd2' from formal union all
select id, date, name, d3 , 'd3' from formal union all
select id, date, name, d4 , 'd4' from formal
) p
inner join (
select id, least(d1, d2, d3, d4) as least_value from formal
) lv on p.id = lv.id
where colvalue = least_value # correction here
order by rand()
limit 1
<强> Results 强>:
| id | date | name | colvalue | colsource | id | least_value |
|----|----------------------|-------|----------|-----------|----|-------------|
| 1 | 2017-02-10T09:00:00Z | bimal | 1 | d2 | 1 | 1 |
对于多行结果,每个id一个:
select
*
from (
select
p.*
, lv.least_value
, @row_num :=IF( @prev = p.id, @row_num + 1, 1)AS RowNumber
, @prev := p.id
from (
select id, date, name, d1 colvalue, 'd1' colsource from formal union all
select id, date, name, d2 , 'd2' from formal union all
select id, date, name, d3 , 'd3' from formal union all
select id, date, name, d4 , 'd4' from formal
) p
inner join (
select id, least(d1, d2, d3, d4) as least_value from formal
) lv on p.id = lv.id
cross join (
select @row_num := 0, @prev := null
) vars
where colvalue = colvalue
order by p.id, rand()
) d
where rowNumber = 1
;
<强>结果强>
| id | date | name | colvalue | colsource | least_value | RowNumber | @prev := p.id |
|----|----------------------|-------|----------|-----------|-------------|-----------|---------------|
| 3 | 2017-02-10T09:00:00Z | suman | 1 | d3 | 1 | 1 | 3 |
| 1 | 2017-02-10T09:00:00Z | bimal | 1 | d1 | 1 | 1 | 1 |
| 2 | 2017-02-10T09:00:00Z | amal | 1 | d2 | 1 | 1 | 2 |