sql 求模 實現 貪婪演算法

2021-06-28 05:22:13 字數 2693 閱讀 3436

背景:

最近在維護乙個專案, 因新功能需求拓展.  有乙個字段儲存 乙個星期中的幾天,可能是全部,也有可能只是其中的星期一, 星期三,等.

因為專案中有乙個列舉值, 已作好初始化賦值工作, 而且 客戶端開發時直接把組合值合併成乙個早已存入這個欄位到db.

我在專案別的地方(動態批量生成月報表時,又需要得到這個具體的頻率值. 因為每個月有幾個星期一,星期三,不是固定的, 需要動態計算.),  所以, 又需要將其還原為 其中具體對應的 星期一,星期三 等. 這裡就需要對這個組合值,進行求模操作. 於是便有了本文.

執行環境: sql server 2014

測試環境: sql server 2005

我們資料庫中,有條記錄,某個欄位值存的就是1552, 表示頻率取 每週五,每週六,每週日各一次

sql指令碼:

declare @total bigint

set @total=1552

--55451121212121

--784546

--2558=1024*2 + 256*1 + 128 * 1 + 64 * 1 + 32 * 1 + 16 * 1 + 1 * 14

--1552= 1024*1 + 512 * 1 + 16*1

--1553= 1024*1 + 512 * 1 + 16*1 + 1 * 1

-- 1554 = 1024*1 + 512 * 1 + 16*1 + 1 * 2

-- 1025 = 1024* 1 + 1 * 1

declare @tblrecurrencetype table

( [dayname] varchar(20),

[dayvalue] bigint,

id bigint identity)

insert into @tblrecurrencetype

( [dayname],

[dayvalue]

)select 'everysaturday',1024

--union all select 'everyworkday',992

union all select 'everyfriday',512

union all select 'everythursday',256

union all select 'everywednesday',128

union all select 'everytuesday',64

union all select 'everymonday',32

union all select 'everysunday',16

union all select 'unknown',1

--select * from @tblrecurrencetype

declare @itime bigint

set @itime=0;

declare @tmpdayvalue bigint

set @tmpdayvalue=0

declare @itblrowcount bigint

set @itblrowcount=0

select @itblrowcount=count(*) from @tblrecurrencetype

while @total>0

begin

set @itime=@itime+1;

select @tmpdayvalue=dayvalue from @tblrecurrencetype where id=@itime

if(@total

begin

if(@itime=@itblrowcount)

begin

from @tblrecurrencetype where [dayvalue]<=@total

endelse

begin

from @tblrecurrencetype where [dayvalue]=@total

endcontinue

end

else

begin

begin

from @tblrecurrencetype where [dayvalue]=@tmpdayvalue

set @total = @total % @tmpdayvalue

endelse

begin

from @tblrecurrencetype where [dayvalue]=@total

set @total = @total - @tmpdayvalue

if(@total<0)

break

endend

end--select @itime -- running times

備註:

本來,可以寫得相對簡單一些. 但完成我需要的功能後. 發現這其實就是乙個貪婪演算法的實現. 想起了n久前某位老師提到的售票員找零問題, 於是, 便有了上面的sql指令碼.

在上面的初始化值中 特意加了一行 unknown , 單位為1, 確保求模結果完全正確.

( 結束) 

貪婪演算法實現裝箱

貪婪演算法實現裝箱操作 public class test 裝箱函式 public void putthehuowu huowu h int num 1 box box null for int i 0 i h.length i boolean isok false box currentbox b...

python搜尋演算法實現 (二)貪婪演算法

假設你辦了個廣播節目,要讓全美國50個州的聽眾都能聽得到,為此,你需要決定在哪些廣播台播出。每個廣播台臺播出都需要費用,所以你需要盡可能地在更少的廣播台播出節目。現有廣播台名單如下 每個廣播台都覆蓋不同的範圍,但是有些是重複的 如何才能找出覆蓋全美50個州的最小廣播台集和呢?先提供一種方法 1 列出...

演算法 用js實現貪婪演算法(覆蓋問題)

適合了解該演算法的人理解 貪婪演算法 覆蓋問題 var obj 存放出現過的字母 var arr letter 存放未擁有arr letter元素最多的obj key值 var arr obj 找到未擁有arr letter元素最多的obj key值 function findmaxobj if m...