2017-01-11 60 views
0

SQL小提琴:http://sqlfiddle.com/#!15/1da00/5訂購CREATED_DATE如果少於1個月,否則排序updated_date

我有一個表,看起來是這樣的:

products 
+-----------+-------+--------------+--------------+ 
| name | price | created_date | updated_date | 
+-----------+-------+--------------+--------------+ 
| chair  | 50 | 10/12/2016 | 1/4/2017  | 
| desk  | 100 | 11/4/2016 | 12/27/2016 | 
| TV  | 500 | 12/1/2016 | 1/2/2017  | 
| computer | 1000 | 12/28/2016 | 1/1/2017  | 
| microwave | 100 | 1/3/2017  | 1/4/2017  | 
| toaster | 20 | 1/9/2017  | 1/9/2017  | 
+-----------+-------+--------------+--------------+ 

我想訂購在此表如果產品創建時間不到30天,那麼結果應該首先顯示(並按更新日期排序)。如果產品被創造30個或更多天前,我希望它後顯示(並經更新的日期是組內排列)

這是結果應該是什麼樣子:

products - desired results 
+-----------+-------+--------------+--------------+ 
| name | price | created_date | updated_date | 
+-----------+-------+--------------+--------------+ 
| toaster | 20 | 1/9/2017  | 1/9/2017  | 
| microwave | 100 | 1/3/2017  | 1/4/2017  | 
| computer | 1000 | 12/28/2016 | 1/1/2017  | 
| chair  | 50 | 10/12/2016 | 1/4/2017  | 
| TV  | 500 | 12/1/2016 | 1/2/2017  | 
| desk  | 100 | 11/4/2016 | 12/27/2016 | 
+-----------+-------+--------------+--------------+ 

我VE開始寫這個查詢:

SELECT *, 
    CASE 
     WHEN created_date > NOW() - INTERVAL '30 days' THEN 0 
     ELSE 1 
    END AS order_index 
FROM products 
ORDER BY order_index, created_date DESC 

但只有少created_date腋臭30天前帶上行,然後created_date訂購。我想在那裏order_index = 1通過updated_date

回答

1

不幸的是在9.3版本涉及的表列只有位置列數或表達式可以在order by使用行也進行排序,以便order_index不可用於case在所有和它的位置不是明確定義的,因爲它在列表中列出*之後。

這將工作。

order by 
    created_date <= (current_date - 30) , case 
    when created_date > (current_date - 30) then created_date 
    else updated_date end desc 

備選地公用表表達式可用於包裹的結果,然後可以通過任何列進行排序。

WITH q AS(
    SELECT *, 
     CASE 
      WHEN created_date > NOW() - INTERVAL '30 days' THEN 0 
      ELSE 1 
     END AS order_index 
    FROM products 
) 
SELECT * FROM q 
ORDER BY 
    order_index , 
    CASE order_index 
     WHEN 0 THEN created_date 
     WHEN 1 THEN updated_date 
    END DESC; 

第三種方法是利用空值。

order by 
    case 
    when created_date > (current_date - 30) then created_date 
    end desc nulls last, 
    updated_date desc; 

當排序列的類型不同時,這種方法非常有用。

+0

這並沒有給出正確的結果。另外,你可以使用'order_index'。我打算爲'order_index'增加更多的值,所以不應該被取出。 – Xecure

+0

oops。 order_index。很難使用,計算列只能按位置引用,所以它們不能用於表達式。 – Jasen