2011年7月15日 星期五

Ms Sql 重複資料查詢與刪除

--檢查重複排序
WITH Get_Last_cmd
AS
(
  SELECT
    *,GroupID = ROW_NUMBER() OVER (PARTITION BY dbowner,custid,facisno ORDER BY cmopendate desc)
  FROM
    dbo.table
)
Select * FROM Get_Last_cmd order by facisno,cmopendate desc;

 --刪除重復
 WITH Get_Last_cmd
AS
(
  SELECT
    GroupID = ROW_NUMBER() OVER (PARTITION BY dbowner,custid,facisno ORDER BY cmopendate desc)
  FROM
    dbo.table
)
delete * FROM Get_Last_cmd WHERE GroupID > 1;

2010年12月7日 星期二

2010年8月5日 星期四

2010年7月27日 星期二

oracle 日期計算


1日期運算 
2 
31. 更改日期顯示的format 
4 ex. 
5 ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD';    
6 階段作業已被更改    
7           
8 select sysdate from dual;    
9           
10 SYSDATE    
11 ----------    
12 2007/09/20    
13           
14 --只對目前session有效,一個 connect 視為一個 session 
15 
162. 日期 + 數值 
17 ex. 
18 select sysdate + 10 from dual; 
19  
20 SYSDATE+10 
21 ---------- 
22 01-OCT-07  
23        
243. 日期 - 數值 
25 ex. 
26 select sysdate - 10 from dual; 
27 
28 SYSDATE-10 
29 ---------- 
30 11-SEP-07 
31 
324. 日期相減得到日期差 
33 ex. 
34 select sysdate - to_date('20070901','yyyymmdd') aa from dual; 
35  
36           AA 
37 ------------- 
38   20.4508218   
39  
40 --◎ 包含時間,所以有小數 
41 --◎ 可做日期欄位的計算 
42  
43 select trunc(sysdate - to_date('20070901','yyyymmdd')) aa from dual; 
44  
45        AA 
46 ---------- 
47        20 
48 --使用trunc取整數,得到日期 
49 
505. 日期相減得到小時差 
51 ex. 
52 select trunc((sysdate - to_date('20070901','yyyymmdd'))*24) aa from dual; 
53 
54         AA 
55 ---------- 
56        490 
57 
586. 日期相減得到分鐘差 
59 ex. 
60 select trunc((sysdate - to_date('20070901','yyyymmdd'))*24*60) aa from dual; 
61  
62       AA 
63 --------- 
64     29459 
65 
667. 日期相減得到秒數差 
67 ex. 
68 select trunc((sysdate - to_date('20070901','yyyymmdd'))*24*60*60) aa from dual; 
69 
70        AA 
71 ---------- 
72    1767606 
73 
748. 日期 + n小時 
75 ex. 
76 select to_char(sysdate,'YYYY/MM/DD HH24:MI:SS') aa from dual; 
77  
78 AA 
79 -------------------- 
80 2007/09/21 11:03:47  --系統時間 
81  
82 select to_char(sysdate+2/24,'YYYY/MM/DD HH24:MI:SS') aa from dual; 
83 
84 AA 
85 -------------------- 
86 2007/09/21 13:03:47  --加2小時(理論值) 
87 
889. 日期 + n分鐘  
89 ex. 
90 select to_char(sysdate+10/1440,'YYYY/MM/DD HH24:MI:SS') aa from dual; 
91 
92 AA 
93 -------------------- 
94 2007/09/21 11:13:47  --加10分鐘(理論值) 
95 
9610. 日期+ n秒鐘 
97 ex. 
98 select to_char(sysdate+10/86400,'YYYY/MM/DD HH24:MI:SS') aa from dual; 
99     
100 AA 
101 -------------------- 
102 2007/09/21 11:13:57  --加10秒鐘(理論值) 

2010年4月27日 星期二

Oracle 取排行榜

WITH qa AS
     (SELECT '國文' cid, 60 ca, TRUNC (SYSDATE) cb
        FROM DUAL
      UNION
      SELECT '國文' cid, 100 ca, TRUNC (SYSDATE) + 1 cb
        FROM DUAL
      UNION
      SELECT '國文' cid, 60 ca, TRUNC (SYSDATE) + 3 cb
        FROM DUAL
      UNION
      SELECT '國文' cid, 100 ca, TRUNC (SYSDATE) + 3 cb
        FROM DUAL
      UNION
      SELECT '數學' cid, 40 ca, TRUNC (SYSDATE) + 3 cb
        FROM DUAL
      UNION
      SELECT '數學' cid, 70 ca, TRUNC (SYSDATE) + 2 cb
        FROM DUAL
      UNION
      SELECT '數學' cid, 90 ca, TRUNC (SYSDATE) + 3 cb
        FROM DUAL
        UNION
      SELECT '數學' cid, NULL ca, TRUNC (SYSDATE) + 3 cb
        FROM DUAL),
     qb AS
     (SELECT DENSE_RANK () OVER (PARTITION BY cid ORDER BY ca DESC  NULLS LAST) AS dense_rank_top,
             RANK () OVER (PARTITION BY cid ORDER BY ca DESC  NULLS LAST) AS rank_top,
             MAX(CA) KEEP (DENSE_RANK LAST ORDER BY CA  NULLS LAST) OVER (PARTITION BY CID) "Highest" ,
             MIN(ca) KEEP (DENSE_RANK FIRST ORDER BY ca  NULLS LAST) OVER (PARTITION BY cid) "Lowest",qa.*
        FROM qa)
SELECT *
  FROM qb



DENSE_RANK_TOP RANK_TOP Highest Lowest CID CA CB
1 1 100 60 國文 100 2010/4/29
1 1 100 60 國文 100 2010/5/1
2 3 100 60 國文 60 2010/4/28
2 3 100 60 國文 60 2010/5/1
1 1 40 數學 90 2010/5/1
2 2 40 數學 70 2010/4/30
3 3 40 數學 40 2010/5/1
4 4 40 數學 2010/5/1

同行資料列欄位取最大值與最小值

GREATEST ( expr_list )
LEAST ( expr_list ) 




SQL> select LEAST(1,2,3,5,4,7,6) from dual;
 
LEAST(1,2,3,5,4,7,6)
--------------------




SQL> select GREATEST(1,10,3,5,5,1,6) from dual;
 
GREATEST(1,10,3,5,5,1,6)
------------------------
                      10