本帖最後由 snoopy11hk 於 2016-3-31 21:47 編輯
其實你有無真係試過架?  同埋你知唔知點用既?  唔好只係拋書包.
樓主既要求, under account_no 中搵第一 ...
Super169 發表於 2016-3-31 17:51



    相信你用開的 dbms 無 analytic function, 所以先會用 aggregate function 黎做..
我都有提供 suggested aggregate function solution
即係 aggregate by account_no, count, 等等, 再 join 埋原本的 table

但係 如果有 analytic function 出現的 dbms, 用 aggregate function 就係 very prone to error, 即係我講的 90% 用錯

其實我兩隻 version 都有比到
analytic function 的俾左 95% 的 code (樓主幫手 fix 左個, )
aggregate function 的都俾左 pseudo code 出黎

TOP

回覆 31# snoopy11hk
  
我唔你好明你成日話 prone to error 係想表達乜野.  寫 code 易唔易出錯, 係睇寫果個人知唔知做緊乜.
你有無真係試過我比出黎果句 SQL?  將 rownum 代番入去, 係咪會出錯?
或者對於你黎講可能覺得會 prone to error, 不過, 就唔係句 SQL 本身既問題囉.
就好似我唔熟 Oracle, 你一樣可以話比我用 Oracle 會 prone to error, 但就唔關 Oracle 事.

我都比左個例子出黎咁耐, 不如你就用 analytic function 寫出黎比我學下野吧.   
我聽日試下比較下兩種 syntax, 睇下出黎既 plan 同 performance 有幾大分別.

TOP

本帖最後由 snoopy11hk 於 2016-3-31 22:40 編輯
回覆  snoopy11hk
  
我唔你好明你成日話 prone to error 係想表達乜野.  寫 code 易唔易出錯, 係睇寫果個 ...
Super169 發表於 2016-3-31 22:31



    我唔係太想去 struggle 係呢 D 咁 minor 的野
重點回

HAVING row_number() = min(row_number())
-->呢句係 oracle 行唔到, analytic function can only exist in select list or order by

寫 code 易唔易出錯, 其實係睇個意思
-->用錯 analytic/aggregate function 一樣會 prone to error
-->最簡單就係要唔要 row collapse, 要就去 aggregate, 唔要就analytic

我都比左個例子出黎咁耐, 不如你就用 analytic function 寫出黎比我學下野吧
-->analytic function 的係 #8

TOP

我唔係太想去 struggle 係呢 D 咁 minor 的野
重點回

HAVING row_number() = min(row_number())
-- ...
snoopy11hk 發表於 2016-3-31 22:38


你唔會係講緊 row_number() 呢個 function 唔 work 掛?

OMG....唔該係睇番上去, 我一早講左我唔知 Oracle 入面, 點樣攞到 row no, 因為我用開既 SQL sever 無.
後尾樓主講話係 rownum, 我咪講左改用 rownum 代入去...

你唔係仲諗緊我用 row_number() 所以唔 work 掛.

TOP

本帖最後由 snoopy11hk 於 2016-3-31 23:04 編輯
你唔會係講緊 row_number() 呢個 function 唔 work 掛?

OMG....唔該係睇番上去, 我一早講左我唔知 Oracl ...
Super169 發表於 2016-3-31 22:42
  1. SELECT input_date, account_no, product_cd, agent
  2.   FROM table
  3. GROUP BY account_no
  4. HAVING rownum = min(rownum)
複製代碼
我當係咁行先
其實呢句就咁睇已經係 唔合符 standard sql 的 syntax
group by account_no
input_date, product_cd, agent 都要有 aggregate function 去包番佢
即係 i.e.
SELECT ACCOUNT_NO, MIN(INPUT_DATE), MIN(PRODUCT_CD), MIN(AGENT)
即係你 row collapse 左 D data, 肯定90% 會錯

就算咁好彩無錯, 都唔代表思考方式正確

而 analytic function 就唔係 row collapse
再講得明白D, 你見係
SELECT *
FROM (SELECT ..... FROM TABLE)
WHERE ROW_NUM = 1
即係只係 再 filter 多一次

TOP

不過都好既, 就當學多樣野!  ...
我叫日日野 發表於 31/3/2016 21:41

不關學嘢事, 兮要資料清清楚楚一眼睇到!

TOP

TOP

我當係咁行先
其實呢句就咁睇已經係 唔合符 standard sql 的 syntax
group by account_no
input_date, prod ...
snoopy11hk 發表於 2016-3-31 22:49


頭先提過, 一個 group 唔一定係好多條 row 既.  
唔明白既人可能以為好彩, 你可以用唔同既 table 試下, 呢句野都唔會有錯的, 睇下係好彩定係必然成立.

簡單講, 係利用左 group 既特性, 幫我 filter 左 account_no 入面 recnum 等於最細值既一堆 record 出黎 (因為 having 後面既 aggregate function, 會針對個 group 而唔係全部 record), 而因為 recnum 係 unique, 變相就等同搵左 account_no 入面 recnum 果隻出黎.  所以,  只要 recnum 存在, 當然一定係 unique 喇,  呢句野都可以搵到出黎.

SQL 得幾個 keyword, 就可以變化萬千.  書本講唔到幾多變化比你聽, 要自己去睇下佢既特性, 就唔駛下下搏好彩.
仲係唔信既, 你真係番去試下先喇.  

唔你可能無認真玩過 group 既特性, 比多個寫法你, 呢句本來易明 D, 不過我唔係太鐘意 sub-query, 所以一開始比一句過既 syntax.
個 group 同個 select 九唔搭八, 你會唔會又覺得呢句做到係因為係好彩呢?  

SELECT recnum, input_date, account_no, product_cd, agent
  FROM <table>
WHERE recnum IN (SELECT min(recnum )
                    FROM <table>
                                   GROUP BY account_no
                                 )

反而你果句就真係有問題了, 真係有點為左答案, 有可能會唔理後果.  雖然唔係 prone to error, 但仲大鍰過 prone to error.
唔想個 post 太長難睇, 我一陣再解釋比你聽, 你可以先諗諗點解.  
放心, 我唔係亂咁吹水, 我會比個合理解釋你既.

TOP

本帖最後由 snoopy11hk 於 2016-4-1 00:05 編輯
頭先提過, 一個 group 唔一定係好多條 row 既.  
唔明白既人可能以為好彩, 你可以用唔同既 table 試下,  ...
Super169 發表於 2016-3-31 23:35



    我唔知 SQL Server 有無enforce 到我話的
"Column 'xyz' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause."

但 oracle 有呢隻 error
ORA-00979: not a GROUP BY expression


SQL 本來就真係只有幾個 keyword, 但係而家 的 MSSQL 好, Oracle SQL 好, 都有好多新野
Apply, Pivot,  Virtual Table 等等等
呢D 新野 可以令到個 logic 更直觀, 更易明, 唔係 dirty tricks

繼續講少少 oracle 野
oracle 的 rownum 係 dynamic column, 係 select 後先出, 所以rownum in (rownum, rownum2, rownum3) 係唔 work
如果要 fix row 係要用 rowid

TOP

回覆 35# snoopy11hk


唔好意思, 原來 #8 係你提供既, 我 miss 左, 仲成日叫你比 sample 我, 呢樣係我錯.
見你咁鐘意講 prone to error, 我終於理解到了, 原來你真係咁既.

你句 SQL, 就咁睇, 真係好似無問題 (其實如果做開野既, 應該即時有一個疑問).

唔好意思, 你之前同我講既野, 我真心覺得, 你應該係要同自己講至得.  

除左 prone to error, 你果句真係好彩...#8 真係一個好好既例子.

我都應該講番原因了, 希望你唔好介意:

1) INPUT_DATE 可以唔 unique, 而你用 account_no 入面 sort by input_date 既 第一條, 正常應該當成唔知會比乜你.
   基於不明確因素下, 而得到想要既結果, 呢樣就真係可以叫做好彩了.

2) 我之前亦提過, 唔 sure Oracle 有無 recnum (即係 insert 入去既排序)
   如果 Oracle 本身不存在 recnum, 成條題目應該係無答案, 而唔係比一條唔知既 row 出黎.
   如果 recnum 存在, 就應該用番 recnum, 而唔係用 input_date.  之前一早都講過, 用 input_date 已經犯左明顯既錯.

3) Performance issue (呢點唔肯定, 就係上面講, 應該即時睇到既問題, 但有可能 optimizer 可以幫到你)
   如果我無理解錯, 你既 Sub-query 入面會將 d record 排一次, 然後 assgin row_num 比佢, 個 row_num 就等於排第幾.
   之後要 row_num = 1, 即係 最細果條.  唔理佢係咪要求果條, 除非你好了解 optimizer 點做野, 否則, 呢個做法絕對唔要得.
   
   唔係講笑架, 如果你將來做野, 一定要小心.  呢 D case, 新人衰得最多.  一開始運作無事, 用耐左害死人.
   呢個唔係答案對定錯既問題, 係對 performance 有影響.  如果只係交功課, 做到就算, 你可以OK.
   但係, 當你寫慣左好少出錯, 就要試下諗 performance.
   你只係想要最細果條 row, 但係就走去幫佢全部 sort 一次, assign 個 order 比全部 record.
   我諗你應該知道, 搵個 min 同咁樣 assign order, 對 performance 有幾大影響?
   如果你想用 sub-query 去寫, 可以睇番我上面個例子.  如果唔明既, 我可以解釋比你聽.  不過果句應該好簡單吧.
   
   當然, 正如我講, 我唔 sure Oracle 既 optimizer 有幾勁, 有無可能做 sub-query 果下分析個 result set 會比人點用, 然後幫你將 sorting 當成搵 min.  
   so far, 我未玩過咁強既 optimizer, 通常都只係針對一句 query 入面既 order/filter 去做, 要睇埋 result set 點比人用, 就太強了.
   呢樣野, 好老實講, 除非 Oracle 有明顯講明佢隻 optimizer 做到, 否則都唔好亂黎.
   如果你做緊野既, 而又係做呢行既, 真係要小心D.  sort 野同 搵 min 係兩回事, 無必要 sort 就唔好亂黎.
   一開始公司 record 唔多, 比你 sort 下無壞, 將來 database 大左, 後果可大可小.

唔知你接唔接受我既 comment 喇, 不過, 我真心希望你可以認真想想, 寫 SQL 要考慮 D 乜.  

你講得無錯既: "就算咁好彩無錯, 都唔代表思考方式正確."  希望你自己真係明白.

TOP