1. 程式人生 > >【LeetCode】626.換座位-學習筆記-對行數的轉換

【LeetCode】626.換座位-學習筆記-對行數的轉換

小美是一所中學的資訊科技老師,她有一張seat座位表,平時用來儲存學生名字和與他們相對應的座位 id

其中縱列的id是連續遞增的

小美想改變相鄰倆學生的座位。

你能不能幫她寫一個 SQL query 來輸出小美想要的結果呢?

答案:

方法一:按題目的要求,對所有資料進行拆分,12互換,34互換,最後一個是奇數的不動,然後就分成三塊來寫,第一塊就是id為偶數的,id-1就相當於和奇數的互換了,第二塊是id為奇數的,id+1就相當於和偶數的互換了,最後一塊是最後一個為奇數的,不換,然後三塊合併排序就出來結果了。

  1. select s.id , s.student from
  2. (  
  3. select id-1 as id ,student 
    from seat where mod(id,2)=0  
  4. union
  5. select id+1 as id,student from seat where mod(id,2)=1 and id !=(selectcount(*) from seat)  
  6. union
  7. select id,student from seat where mod(id,2)=1 and id = (selectcount(*) from seat)  
  8. ) s orderby id;  

方法二:此種方法是上面一種方法的一個拓展簡化,思路差不多,也有區別

對照上表及其查詢結果可以得知,當原id為奇數時,交換座位後的id變為id+1,

當原id為偶數時,交換座位後的id變為id-1,另一個方面需要考慮的是,學生人數為奇數時,最後一個學生的id不變,故應當用子查詢確定學生的人數,然後分情況討論即可。

  1. select (case
  2.       when mod(id,2)!=0 and id!=counts then id+1  
  3.       when mod(id,2)!=0 and id=counts then id  
  4.       else id-1 end)as id,student  
  5.       from seat,(selectcount(*)as counts from seat)as seat_counts  
  6.                 order
    by id;  

因為題目寫了,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 排序即可。