根據以下排序優先權排序
1、所有資料相同如 1.11 2.22 3.33 ~ 9.99 小數點左邊大優先排序
2、小數后兩位為0 1.00 2.00 3.00 ~9.00 小數點左邊大優先排序
3、小數后兩位相同 0.11 0.22 0.33 ~0.99 小數點右邊大優先排序
4、三位連數 1.23 2.34 3.45 ~ 7.89 數值大優先排序
5 、三位連數 9.87 8.76 7.65 ~ 3.21 數值大優化先排序
6、以上無符合的排序 三位相加 0.35 = 8 1.69 = 6 等于 10 為10 大于10去掉10取余數 如13 取 3 數額大優先
以上排序 從 1 ~ 6 排序
以下是資料
3.68
2.69
4.36
0.11
6.00
3.33
4.56
3.78
6.54
7.89
2.22
8.56
4.37
3.21
9.96
8.88
4.65
7.89
感謝前輩們的幫助!
uj5u.com熱心網友回復:
你自己做個權值計算的函式用來排序啊。假定輸入引數為 d
回傳值(權值) r 為 int 型別
關鍵是你自己判定出6種情況,以下為 r 的計算方式
1、r = 1000 + d * 100
2、r = 2000 + d
3、r = 3000 + ROUND(d,0,1)*100 + (1-(d-ROUND(d,0,1)))*100
4、r = 4000 + d * 100
5、r = 5000 + d * 100
6、r = 6000 + 三位相加(d)
uj5u.com熱心網友回復:
感謝感謝,思路不錯!
uj5u.com熱心網友回復:
你看下面是不是你要的?
;WITH t(num) AS(
SELECT 3.68 UNION ALL
SELECT 2.69 UNION ALL
SELECT 4.36 UNION ALL
SELECT 0.11 UNION ALL
SELECT 6.00 UNION ALL
SELECT 3.33 UNION ALL
SELECT 4.56 UNION ALL
SELECT 3.78 UNION ALL
SELECT 6.54 UNION ALL
SELECT 7.89 UNION ALL
SELECT 2.22 UNION ALL
SELECT 8.56 UNION ALL
SELECT 4.37 UNION ALL
SELECT 3.21 UNION ALL
SELECT 9.96 UNION ALL
SELECT 8.88 UNION ALL
SELECT 4.65 UNION ALL
SELECT 7.89
)
SELECT * INTO #td FROM t
;WITH a AS(
SELECT t.num,STUFF(p.s,1,1,'') AS s ,CASE WHEN STUFF(p.s,1,1,'') ='0,0,0' THEN 1
WHEN STUFF(p.s,1,1,'') LIKE '0,-[1-9],0' THEN 2
WHEN STUFF(p.s,1,1,'') LIKE '0,[1-9],0' THEN 3
WHEN STUFF(p.s,1,1,'') ='0,1,1' THEN 4
WHEN STUFF(p.s,1,1,'') ='0,-1,-1' THEN 5
ELSE 6 END AS NumType
FROM #td AS t
CROSS APPLY(
SELECT ','+CONVERT(VARCHAR,
CONVERT(INT,SUBSTRING(convert(VARCHAR,t.num),sv.number,1))-
CONVERT(INT,CASE WHEN SUBSTRING(convert(VARCHAR,t.num),sv.number-1,1)='.' THEN SUBSTRING(convert(VARCHAR,t.num),sv.number-2,1)
WHEN sv.number=1 THEN SUBSTRING(convert(VARCHAR,t.num),sv.number,1)
ELSE SUBSTRING(convert(VARCHAR,t.num),sv.number-1,1) END ))
FROM master.dbo.spt_values AS sv
WHERE sv.type='P' AND sv.number BETWEEN 1 AND LEN(t.num)
and SUBSTRING(convert(VARCHAR,t.num),sv.number,1)!='.'
FOR XML PATH('')
) p(s)
)
SELECT * FROM a ORDER BY NumType,CASE WHEN a.NumType LIKE '[1245]' THEN a.num ELSE -num END desc
/*
num s NumType
8.88 0,0,0 1
3.33 0,0,0 1
2.22 0,0,0 1
6.00 0,-6,0 2
0.11 0,1,0 3
7.89 0,1,1 4
7.89 0,1,1 4
4.56 0,1,1 4
6.54 0,-1,-1 5
3.21 0,-1,-1 5
2.69 0,4,3 6
3.68 0,3,2 6
3.78 0,4,1 6
4.36 0,-1,3 6
4.37 0,-1,4 6
4.65 0,2,-1 6
8.56 0,-3,1 6
9.96 0,0,-3 6
*/
/*
num
8.88
3.33
2.22
6.00
0.11
7.89
7.89
4.56
6.54
3.21
2.69
3.68
3.78
4.36
4.37
4.65
8.56
9.96
*/
uj5u.com熱心網友回復:
你要實作這樣的功能,只能用加權在表加多一個欄位記錄權值,最次變更資料都用 加權公式去重繪
uj5u.com熱心網友回復:
漏了一個條件,我寫的這個陳述句還有其他不嚴謹的地方,考慮可能有重復的num,最好能創建一個唯一的序號,另外對于最后取和后與10 取余,24和14的值相同,數值可能不僅三個數字等
;WITH a AS(
SELECT t.num,STUFF(p.s,1,1,'') AS s ,s.tn
,CASE WHEN STUFF(p.s,1,1,'') ='0,0,0' THEN 1
WHEN STUFF(p.s,1,1,'') LIKE '0,-[1-9],0' THEN 2
WHEN STUFF(p.s,1,1,'') LIKE '0,[1-9],0' THEN 3
WHEN STUFF(p.s,1,1,'') ='0,1,1' THEN 4
WHEN STUFF(p.s,1,1,'') ='0,-1,-1' THEN 5
ELSE 6 END AS NumType
FROM #td AS t
CROSS APPLY(
SELECT ','+CONVERT(VARCHAR,
CONVERT(INT,SUBSTRING(convert(VARCHAR,t.num),sv.number,1))-
CONVERT(INT,CASE WHEN SUBSTRING(convert(VARCHAR,t.num),sv.number-1,1)='.' THEN SUBSTRING(convert(VARCHAR,t.num),sv.number-2,1)
WHEN sv.number=1 THEN SUBSTRING(convert(VARCHAR,t.num),sv.number,1)
ELSE SUBSTRING(convert(VARCHAR,t.num),sv.number-1,1) END ))
FROM master.dbo.spt_values AS sv
WHERE sv.type='P' AND sv.number BETWEEN 1 AND LEN(t.num)
and SUBSTRING(convert(VARCHAR,t.num),sv.number,1)!='.'
FOR XML PATH('')
) p(s)
CROSS APPLY(
SELECT SUM(tn) AS tn FROM (
SELECT CONVERT(INT,SUBSTRING(convert(VARCHAR,t.num),sv.number,1)) AS tn
FROM master.dbo.spt_values AS sv
WHERE sv.type='P' AND sv.number BETWEEN 1 AND LEN(t.num) and SUBSTRING(convert(VARCHAR,t.num),sv.number,1)!='.'
) a
) s
)
SELECT a.num,a.tn FROM a ORDER BY NumType,CASE WHEN a.NumType LIKE '[1245]' THEN a.num WHEN a.NumType=3 THEN -num ELSE a.tn%10 END desc
uj5u.com熱心網友回復:
用陳述句太耗性能,這不是資料庫處理的事借用#5測驗資料
看你的規律可以用以下演算法相對比較高效
e.g.
;WITH t(num) AS(
SELECT 3.68 UNION ALL
SELECT 2.69 UNION ALL
SELECT 4.36 UNION ALL
SELECT 0.11 UNION ALL
SELECT 6.00 UNION ALL
SELECT 3.33 UNION ALL
SELECT 4.56 UNION ALL
SELECT 3.78 UNION ALL
SELECT 6.54 UNION ALL
SELECT 7.89 UNION ALL
SELECT 2.22 UNION ALL
SELECT 8.56 UNION ALL
SELECT 4.37 UNION ALL
SELECT 3.21 UNION ALL
SELECT 9.96 UNION ALL
SELECT 8.88 UNION ALL
SELECT 4.65 UNION ALL
SELECT 7.89
)
SELECT * FROM t ORDER BY CASE WHEN num*100%111=0 THEN 6000
WHEN CAST(num AS INT)=t.num THEN 5000
WHEN num*100%11=0 THEN 4000
WHEN num*100%111=12 THEN 3000
WHEN num*100%111=99 THEN 2000
ELSE (CAST(num AS INT)+CAST(num*10%10 AS INT)+CAST(num*100%10 AS INT))%10*10
END desc, num desc
/*
num
8.88
3.33
2.22
6.00
0.11
7.89
7.89
4.56
6.54
3.21
8.56
3.78
3.68
2.69
4.65
9.96
4.37
4.36
*/
uj5u.com熱心網友回復:
可自定義每一種排序順序方法
WHEN num*100%111=0 THEN 6000+(10-num)
WHEN CAST(num AS INT)=num THEN 5000+num
查看效果
e.g.
;WITH t(num) AS(
SELECT 3.68 UNION ALL
SELECT 2.69 UNION ALL
SELECT 4.36 UNION ALL
SELECT 0.11 UNION ALL
SELECT 6.00 UNION ALL
SELECT 3.33 UNION ALL
SELECT 4.56 UNION ALL
SELECT 3.78 UNION ALL
SELECT 6.54 UNION ALL
SELECT 7.89 UNION ALL
SELECT 2.22 UNION ALL
SELECT 8.56 UNION ALL
SELECT 4.37 UNION ALL
SELECT 3.21 UNION ALL
SELECT 9.96 UNION ALL
SELECT 8.88 UNION ALL
SELECT 4.65 UNION ALL
SELECT 7.89
)
SELECT * FROM t ORDER BY CASE WHEN num*100%111=0 THEN 6000+(10-num)
WHEN CAST(num AS INT)=num THEN 5000+num
WHEN num*100%11=0 THEN 4000
WHEN num*100%111=12 THEN 3000
WHEN num*100%111=99 THEN 2000
ELSE (CAST(num AS INT)+CAST(num*10%10 AS INT)+CAST(num*100%10 AS INT))%10*10
END DESC
/*
num
2.22
3.33
8.88
6.00
0.11
7.89
4.56
7.89
6.54
3.21
8.56
3.78
2.69
3.68
4.65
9.96
4.37
4.36
*/
uj5u.com熱心網友回復:
學習下
uj5u.com熱心網友回復:
6666666uj5u.com熱心網友回復:
learning~uj5u.com熱心網友回復:
好復雜,學習下
uj5u.com熱心網友回復:
來學習學習
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
yimoj-。-uj5u.com熱心網友回復:
這么多啊
uj5u.com熱心網友回復:
根據規則, 把0.00到9.99全部寫在一張表中, 放一個排序欄位, 手工算好填進去, 也就1000條記錄.uj5u.com熱心網友回復:
這個只能自己寫程式處理了。uj5u.com熱心網友回復:
不是很懂這個額uj5u.com熱心網友回復:
select * from test
order by
substr(test1,0,1) desc,
substr(test1,3,4) desc,
(case substr(test1,3,1) WHEN substr(test1,4,5) THEN substr(test1,3,4) else null end) desc;
以上只計算了1、2、3排序,4、5、6可以以此類推,邏輯都是一樣的,望對你有幫助
uj5u.com熱心網友回復:
看樓上寫的太費勁,簡單回復下uj5u.com熱心網友回復:
應該可以寫一標量函式,將排序的規則放函式里再呼叫uj5u.com熱心網友回復:
寫一個函式回傳數值是傳入引數屬于123456那種,先按函式回傳值排序再按數值排序轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/11401.html
標籤:疑難問題
