2017-08-22 78 views
0

列的值如何訂購select語句的數據集我有這個表基於其在SQL Server

create table Item 
(
    Id bigint primary key identity(1,1), 
    Status nvarchar(100), 
    DateFiled datetime 
) 

INSERT INTO Item 
VALUES ('CLOSED', '2017-08-23 16:42:32.720'), --1 
     ('OPEN', '2017-08-21 16:42:32.720'), --2 
     ('OPEN', '2017-08-22 16:42:32.720'), --3 
     ('GRABBED', '2017-08-22 16:42:32.720'), --4 
     ('CLOSED', '2017-08-21 16:42:32.720'), --5 
     ('OPEN', '2017-08-23 16:42:32.720'); --6 

如何使由下列條件下令一個SELECT語句?

  • 如果(沒有抓取的項目):1個記錄項目,最早提交的OPEN狀態應該是第一行。
  • ELSE:抓住項目應該是第一

  • 其次是封閉的項目

  • 其次是開放式的項目

回答

2

可以計算使用子查詢一些彙總統計,然後使用在order by

如果我有正確的規則:

select i.* 
from (select i.*, 
      row_number() over (partition by status order by datefiled) as seqnum, 
      sum(case when status = 'GRABBED' then 1 else 0 end) over() as num_grabbed 
     from items i 
    ) i 
order by (case when num_grabbed = 1 and status = 'OPEN' and seqnum = 1 
      then 1 
      when status = 'GRABBED' then 2 
      when status = 'CLOSED' then 3 
      else 4 
     end); 
+0

這是無法實現的select語句?當我回去工作時,我會嘗試使用它,儘管這會對我的代碼造成一些劇烈的變化,因爲我使用stringbuilder構建了我的查詢並對現有代碼進行了重構。 –

1

其餘您可以創建一個條件order by使用情況。它將根據每行的案例結果進行排序。

order by case when exists (select 1 from Item where status = 'GRABBED') 
        then case 
          when status = 'GRABBED' then 1 
          when status = 'CLOSED' then 2 
          when status = 'OPEN' then 3 
          else 4 
         end  
        else case 
          when status = 'OPEN' then 1 
          else 2 
         end 
       end, 
     DateFiled