iT邦幫忙

0

有關SQL 查詢問請教

sql

12345-651
12345-652
12345-6E1
12345-6E2
12345-A52
12345-AS2
12876-6G1
12876-6G2
12876-A71
12876-A72
.....等
今如要把以上的號碼擷取該前5碼之排序最小之前2筆
要顯示如下所示
12345-651
12345-652
12876-A71
12876-A72
:判斷標準 前5碼相同為同一個組別,再以第7和8碼判斷取最小值之前2筆
例:12345 相同為同一組 , 第7+8碼 65,6E,A5,AS 排序最小取出前2筆
->12345-651
12345-652
....等
請問各位前輩在SQL 語法要如何下呢?我有些想不通??謝謝

sukc_kimi iT邦新手 5 級 ‧ 2017-09-22 11:37:56 檢舉
對了, 第7+8碼要先判斷第8 碼後,再判斷第7 碼, 我忘了改正!
你可以試試分組排序~
ROW_NUMBER() OVER(PARTITION BY a ,b ORDER BY c DESC)
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
baida0630
iT邦新手 4 級 ‧ 2017-09-22 12:15:14

我自己想到的辦法是 透過 SUBSTRING(欄位名稱 or '字串',起始數字,結束數字) 新欄位名稱

select 欄位A,SUBSTRING(欄位A,1,5) CC,SUBSTRING(欄位A,7,8) DD,SUBSTRING(欄位A,8,8)EE from 表單名稱

你就可以獲得以上的資料 然後再透過你想要怎麼要排序去下Order by

2
一級屠豬士
iT邦新手 2 級 ‧ 2017-09-24 20:25:37
create table ithelp170924 (
  val char(9) not null
);

insert into ithelp170924 values
('12345-651'),
('12345-652'),
('12345-6E1'),
('12345-6E2'),
('12345-A52'),
('12345-AS2'),
('12876-6G1'),
('12876-6G2'),
('12876-A71'),
('12876-A72');

--
with t1 as (
select val
     , row_number() over (partition by left(val, 5) 
         order by substring(val from 8 for 1), substring(val from 7 for 1) ) rn
  from ithelp170924
)
select val
  from t1
 where rn < 3;

    val    
-----------
 12345-651
 12345-652
 12876-A71
 12876-A72
(4 筆資料列)
 
0
捷客
iT邦新手 4 級 ‧ 2017-09-27 10:15:16

抱歉,回錯問題了

小魚 iT邦大師 1 級 ‧ 2017-09-27 11:55:07 檢舉

/images/emoticon/emoticon10.gif

我要發表回答

立即登入回答