【LeetCode】626.換座位-學習筆記-對行數的轉換
阿新 • • 發佈:2019-02-06
小美是一所中學的資訊科技老師,她有一張seat
座位表,平時用來儲存學生名字和與他們相對應的座位 id。
其中縱列的id是連續遞增的
小美想改變相鄰倆學生的座位。
你能不能幫她寫一個 SQL query 來輸出小美想要的結果呢?
答案:
方法一:按題目的要求,對所有資料進行拆分,1、2互換,3、4互換,最後一個是奇數的不動,然後就分成三塊來寫,第一塊就是id為偶數的,id-1就相當於和奇數的互換了,第二塊是id為奇數的,id+1就相當於和偶數的互換了,最後一塊是最後一個為奇數的,不換,然後三塊合併排序就出來結果了。
- select s.id , s.student from
- (
- select id-1 as id ,student
- union
- select id+1 as id,student from seat where mod(id,2)=1 and id !=(selectcount(*) from seat)
- union
- select id,student from seat where mod(id,2)=1 and id = (selectcount(*) from seat)
- ) s orderby id;
方法二:此種方法是上面一種方法的一個拓展簡化,思路差不多,也有區別
對照上表及其查詢結果可以得知,當原id為奇數時,交換座位後的id變為id+1,
- select (case
- when mod(id,2)!=0 and id!=counts then id+1
- when mod(id,2)!=0 and id=counts then id
- else id-1 end)as id,student
- from seat,(selectcount(*)as counts from seat)as seat_counts
- order
因為題目寫了,id是連續遞增的,所以,學生換位,可以轉換成id數值的變換。
一行與二行換,三行與四行換,五行為最後一行,則不換。
所以 id-1 and mod(id,2)=0 這就是對於奇數行 位置的 定義 (如果有下一行,則與下一行換位);
同樣 id+1 and mod(id,2)=1 這就是對於偶數行 位置的 定義 (與上一行的奇數行換位)
而 mod(id,2)=1 and id = (select count(*) from seat) ,這就是當id數與行數相等的時候(即最後一行)時,id保持不變。
最後通過order by id 排序即可。