Board logo

標題: [技術討論] (己解決)(SQL) 每個account 只要第一條 record [打印本頁]

作者: 我叫日日野    時間: 2016-3-29 15:58     標題: (己解決)(SQL) 每個account 只要第一條 record

本帖最後由 我叫日日野 於 2016-4-17 23:08 編輯

請教各位ching, 我有個 table如圖(有顏色的部份),
每個 "account_no" 我只係想出佢第一條既 record, 其他唔要, 請問 SQL(oracle) 可以點樣寫?

嗜係我只想留低以下既 row:
A, C, F, H, L

感激!!

[attach]1876778[/attach]


----------
20160417:
update 返個header 先, 多謝咁多位ching, 問題已經解決! :)
作者: 我叫日日野    時間: 2016-3-29 16:07

如果唔同日子我都可以用 max date 去 group 埋佢, 但係有D係同一日入...
有D account 就出現4次等等...

我只想要每個account 既最先(前)果條就 OKay
作者: WhatTheFish    時間: 2016-3-29 16:23

select min(InputDate), Account_no, Product_cd, Agent
from table
group by Account_no

未測試, 你可以TRY下
作者: 我叫日日野    時間: 2016-3-29 16:47

select min(InputDate), Account_no, Product_cd, Agent
from table
group by Account_no

未測試, 你可以T ...
WhatTheFish 發表於 2016-3-29 16:23



    thx!
其實再加埋 min(product_cd), min(agent) 黎 group 都得既... 不過實際上個 TABLE 重有好多 column(20個左右), 唔通真係要咁做? #__#
作者: 望月小妖    時間: 2016-3-29 16:59

https://docs.oracle.com/cd/B1930 ... 00/functions123.htm
作者: 望月小妖    時間: 2016-3-29 17:17

「每個 "account_no" 我只係想出佢第一條既 record」即係乜?
max(input_date)?max(procudt_cd)?max(agent)?

點解係A,唔係B?
點解係C,唔係D,唔係E?
點解係F,唔係G?
點解係H,唔係I,唔係J,唔係K?
點解係L,唔係M?
作者: 我叫日日野    時間: 2016-3-29 17:29

回覆 6# 望月小妖


    WA! 我記得你個名!! 不過唔記得咩game 見過 XD

any肥, 我最後咁:
唔知係咪有D 蠢

CREATE TABLE duplicate_records_2 AS
SELECT ROWNUM rn, A.* FROM duplicate_records_1 A
;
SELECT A.*
FROM duplicate_records_2 A,
(
SELECT account_no, MIN(ROWNUM) min_row_num
FROM duplicate_records_1
GROUP BY account_no
) b
WHERE A.account_no = b.account_no
AND A.rn = b.min_row_num
;
作者: snoopy11hk    時間: 2016-3-29 18:13

本帖最後由 snoopy11hk 於 2016-3-31 22:39 編輯
回覆  望月小妖


    WA! 我記得你個名!! 不過唔記得咩game 見過 XD

any肥, 我最後咁:
唔知係咪有D 蠢  ...
我叫日日野 發表於 2016-3-29 17:29



    我會咁寫
SELECT *
FROM
(
SELECT
a.*
, ROW_NUMBER() OVER (PARTITION BY ACCOUNT_NO ORDER BY INPUT_DATE ASC) AS ROW_NUM
FROM a
)
WHERE ROW_NUM = 1
[fix comma @ 2016 March 31 22:38]
作者: 望月小妖    時間: 2016-3-29 18:43

回覆  望月小妖


    WA! 我記得你個名!! 不過唔記得咩game 見過 XD

any肥, 我最後咁:
唔知係咪有D 蠢  ...
我叫日日野 發表於 2016-3-29 17:29



    Group by加Min/Max如出現multiple就錯架喇,一定要排序,用window function拎最大/細果個
作者: 我叫日日野    時間: 2016-3-29 23:33

回覆 8# snoopy11hk


    thx!! 聽日試吓~
作者: 我叫日日野    時間: 2016-3-29 23:41

回覆 9# 望月小妖


    yes... 我成日用 group by + max/min 去搵最大/最少, group 完都可能重有 duplicate, 要一次過 group 多幾個 column 或者落多D criteria ...
作者: Super169    時間: 2016-3-30 13:43

首先你要知道自己想要乜, 每個 account_no 只出第一條, 你就要定義 "第一條" 係乜野意思.

如果 input_date, product_cd, agent 有排序既, 由細到大第一隻就好自然係 min(?) 喇, 否則就係 max(?) 喇.
但係如果乜都唔緊要, 是旦一隻都得, 咁不如唔好要, 就咁攞 account_no 就唔會 group 錯.

SQL server 既 data, 唔計 clustered index, SELECT出黎既排序係由你定既, 就算 SELECT FIRST, 你都要比佢知, 乜野次序下既 FIRST.
你個 case, 真係睇唔出 product_cd 係想點排 (PE 先過 KS, KB 又先過 PE, 唔通排第二個byte?), 所以第一隻係定義唔到.
作者: 我叫日日野    時間: 2016-3-30 15:55

回覆 12# Super169


    ic~
"第一條" 既定義係: 條 record 既輸入先後去排, 最早入果條就係第一條.
如果我用 7# 果條 SQL 應該就係我想要既野.
但係正常做法可能係 8# 果條先岩, 我要再試下.


同埋我諗我明"小妖"既意思, 就以 <F> 同 <G> 果兩行為例, 如果group 埋佢同時又用min(?) 既話, "Product_cd" 就會囉左 "KSE02", "Agent" 就會囉左 "AG01".
但係跟本就冇一條咁既 record.


作者: Super169    時間: 2016-3-30 16:42

回覆  Super169


    ic~
"第一條" 既定義係: 條 record 既輸入先後去排, 最早入果條就係第一條.
如果我 ...
我叫日日野 發表於 2016-3-30 15:55



如果你話用輸入次序, 唔知 Oracle 係咪有呢樣野, 假設有 #8 講既 row_number() 存在 (否則都無得 sort).
SQL 可以用 having 去 filter group 入面既野.'

SELECT input_date, account_no, product_cd, agent
  FROM table
GROUP BY account_no
HAVING row_number() = min(row_number())
作者: mingming123    時間: 2016-3-30 19:41

Select top 1 sql server

via HKEPC Reader for Android
作者: 我叫日日野    時間: 2016-3-30 21:46

我會咁寫
SELECT *
FROM
(
SELECT
a.*
, ROW_NUMBER() OVER (PARTITION BY ACCOUNT_NO, ORDER BY I ...
snoopy11hk 發表於 2016-3-29 18:13



得左, 囉到所有 account 既第一條 record 出黎!
簡短過我上面 7# 果條

不過  "ACCOUNT_NO" 同 "ORDER BY" 之間多左個 comma(,),
delete 左就ok了!
thanks!!
作者: snoopy11hk    時間: 2016-3-30 21:55

得左, 囉到所有 account 既第一條 record 出黎!
簡短過我上面 7# 果條

不過  "ACCOUNT_NO" 同 " ...
我叫日日野 發表於 2016-3-30 21:46


太耐無寫, 唔係好記得 D syntax
作者: toylet    時間: 2016-3-30 22:31

本帖最後由 toylet 於 2016-3-30 22:32 編輯
請教各位ching, 我有個 table如圖(有顏色的部份),
每個 "account_no" 我只係想出佢第一條既 record, 其他唔 ...
我叫日日野 發表於 29/3/2016 15:58

即兮搵 Account_no + Agent 最早出現的 Input_Date 和 當時的 Product_cd?
但兮 Input_Date 會重複, 點揀先? 個 table 本來都無 row number, 設計有問題!
作者: 我叫日日野    時間: 2016-3-30 22:47

如果你話用輸入次序, 唔知 Oracle 係咪有呢樣野, 假設有 #8 講既 row_number() 存在 (否則都無得 sort). ...
Super169 發表於 2016-3-30 16:42



我唔肯定如果你咁寫既話, 係可以只 group 一個 field 都過到關?
我試過照你咁係行唔到, 所以之後我 group 晒上面果4 個 field, 再加你果句 having row_number() = min(row_number()) 係最後.
答案係出 error:
  1. ORA-30484: missing window specification for this function
複製代碼
我諗可能係衰左係 having 果度.
作者: 我叫日日野    時間: 2016-3-30 22:53

即兮搵 Account_no + Agent 最早出現的 Input_Date 和 當時的 Product_cd?
但兮 Input_Date 會重複, 點揀 ...
toylet 發表於 2016-3-30 22:31



    冇錯, 我已經搵到答案了, thanks anyway!
table 本身有記錄每條 record 既row number 的, 唔駛特別加.
用 rownum 就會見到.
作者: 我叫日日野    時間: 2016-3-30 22:54

Select top 1 sql server

via HKEPC Reader for Android
mingming123 發表於 2016-3-30 19:41



    行唔到
作者: Super169    時間: 2016-3-31 00:07

回覆 19# 我叫日日野


我之前都講左, 我唔係用開 Oracle, 所以唔知係咪有 row_number() 呢樣野.  
我見你話 #8 work, 所以至用呢個 funciton.
如果照你 #20 講要用 rownum, 咁你對應改番就得.

唔係話 group 幾多個 field 過關, 而係要睇 requirment 去寫野.
你要每個 account 只出一個, grouping 既基礎就只係 account_no, 再多就係亂黎既.
之後你個 group 入面要 rownum 最細果個, 用 having 去 filter 就得.
唔好因為知道答案係點, 就用句 SQL 去就, 亂咁加野去 group.
咁寫法, 今次 work, 唔代表下次都 work, 遲早出事.

HAVING 係 SELECT 入面既基本 Clause 有的, Oracle 無乜理由無.
你個 error 應該只係 row_number() 出問題.
作者: snoopy11hk    時間: 2016-3-31 08:18

本帖最後由 snoopy11hk 於 2016-3-31 08:31 編輯
回覆  我叫日日野


我之前都講左, 我唔係用開 Oracle, 所以唔知係咪有 row_number() 呢樣野.  
我見你話  ...
Super169 發表於 2016-3-31 00:07


你睇黎都唔太明白呢題問題的重心
呢題唔係 簡單的 aggregate function 做到的問題
因為你要睇哂咁多條 一個 group 入面咁多條, 先知到要攞邊一條

aggregate function 係aggregate 哂所有, 之後再 select aggregate 左的 result
呢一題係唔使 aggregate 任何野好似你咁講, group by 任何野都係prone to error

https://community.oracle.com/thread/2166897?start=0&tstart=0 #4
aggregates take "many rows, collapse them into one"

analytics "do not, there is no row collapsing"


基本上如果你唔用 row_number() 的話你要
一個 group by 左 account_no, min(input_date), count()
join 埋 原本的 table
作者: Super169    時間: 2016-3-31 09:46

本帖最後由 Super169 於 2016-3-31 09:47 編輯
你睇黎都唔太明白呢題問題的重心
呢題唔係 簡單的 aggregate function 做到的問題
因為你要睇哂咁多條 一 ...
snoopy11hk 發表於 2016-3-31 08:18



SQL 應該係基於 requirement 去寫.

如果你用 min(input_date), 可以出現同一日有幾條 row, 就唔係原本既 requirement.
如果本身有 rownum 去 unique 咁排序, 輸入次序就應該睇番 rownum, 用 input_date 已經肯定係錯.
如果無 rownum 既, 原本既 requirement 就唔夠條件去做, 做唔到就係做唔到, 唔可以睇住答案去諗.

至於你話要睇哂個 group 既 row 至先, 呢個係事實.  除非本身有 index 係合用, 否則 min(input_date) 一樣係睇哂個 group 入面咁多條.  我唔 sure analytics function 係咪 sub-query 既原理, 但如果無 index 合用, 都係要做一次 table scan.

簡單去諗下, 我比一堆 record 你, 如果本身無排序, 你唔睇哂全部, 又點知邊條係最細?  無論 base on 邊個 field 都係一樣.  原本既題目無講明有乜野 index, 唔可以假設有條 index 係 account_no 再排 input_date.  相反, 如果佢本身有 recnum 既概念, 背後自動送條 index 落 recnum 都唔奇, 不過, 亦唔需要假設有呢樣野.

始終都係果句, 唔好睇完 data 知道答案再去諗條 SQL 點做個答案出黎, 應該係睇 requirement 去做野.
作者: Super169    時間: 2016-3-31 10:04

回覆 23# snoopy11hk

補充多少少, 我驚自己誤會左你呢句野:

你睇黎都唔太明白呢題問題的重心
呢題唔係 簡單的 aggregate function 做到的問題
因為你要睇哂咁多條 一個 group 入面咁多條, 先知到要攞邊一條


你既意思, 係想話 having 唔 work, 定係 話 having 要睇哂咁多個 group 入面咁多條, 所以唔好.

如果係前者, 唔該你試一試先.
如果係後耆, 我上面答左你了.

你想講問題既重心係乜?  對我黎講, 只係需要基於 requirement 搵出最簡單既就係了.
除非有要求, 我唔會理 D field 叫乜.

或者我變另一條題目出黎,
[attach]1877265[/attach]

要搵每個 account_no 最細 recnum 果條 row 出黎, 你會點寫?
方法可以好多, 用 having 可以, 用 sub-query 搵無人細過你又得, 但你會唔會用 x, y, z 呢幾個 field 呢?
上面既 x, 有類似 input_date 既效果, 但基於個題目, 需要用佢嗎?
作者: snoopy11hk    時間: 2016-3-31 14:33

回覆  snoopy11hk

補充多少少, 我驚自己誤會左你呢句野:



你既意思, 係想話 having 唔 work, 定係 話 h ...
Super169 發表於 2016-3-31 10:04



    having 係 aggregate function 之後的 condition
但係樓主而家個 requirement 係唔需要 row collapsing, 即係用純 aggregate function 90% 錯
作者: Super169    時間: 2016-3-31 17:51

本帖最後由 Super169 於 2016-3-31 18:21 編輯
having 係 aggregate function 之後的 condition
但係樓主而家個 requirement 係唔需要 row collaps ...
snoopy11hk 發表於 2016-3-31 14:33



其實你有無真係試過架?  同埋你知唔知點用既?  唔好只係拋書包.
樓主既要求, under account_no 中搵第一條, 呢個咪係 having + aggregate function 做既野.
唔鐘意咁寫, 可以用 sub-query 都得, 如果唔介意 scan 多次, 用 table join 都得, 但唔可以話呢樣係錯.  

又或者你認為應該點寫?  大家研究下.
作者: Super169    時間: 2016-3-31 18:04

本帖最後由 Super169 於 2016-3-31 18:19 編輯
having 係 aggregate function 之後的 condition
但係樓主而家個 requirement 係唔需要 row collaps ...
snoopy11hk 發表於 2016-3-31 14:33



其實你既意思, 係咪想話 having 應該只係跟 count, average 之類, 又或者 process 一 group row 用?    呢D係一般書本用既例子.
你再了解下 having 點運作,  就會明白點解 min / max 之類都可以咁用.   唔好忘記, 一個 group 唔一定要好多條 row, 可以係一條.

如果話需唔需要, 應該係睇對 performance 有無影響.  你要搵每個 group 最細果條, 如果無 index, scan 哂  d record 係必須既.  如果 account_no + input_date 或者甚至 account_no + recnum 有 index, 為左 performance, 就唔會用 group 入面既 having.  呢個情形就可以講係無需要.

但係,  有無需要同對錯又係另一回事.  我唔熟 Oracle, 唔肯定佢會唔會有 D 特別既 function 會方便D, 但唔代表呢個做法係錯.

就用我上面比出黎個例子, 你試下應該點寫, 實戰比紙上談兵實際得多吧.
作者: toylet    時間: 2016-3-31 21:21

冇錯, 我已經搵到答案了, thanks anyway!  
table 本身有記錄每條 record 既row number 的, ...
我叫日日野 發表於 30/3/2016 22:53

其實不應用 row number, 加一個 column 叫 Input_time(?) 好啲!
用正式的 column names 設計個 database 吧!
作者: 我叫日日野    時間: 2016-3-31 21:41

回覆 29# toylet


我都想...不過我只係一個 user...

不過都好既, 就當學多樣野!
作者: snoopy11hk    時間: 2016-3-31 21:45

本帖最後由 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 出黎
作者: Super169    時間: 2016-3-31 22:31

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

我都比左個例子出黎咁耐, 不如你就用 analytic function 寫出黎比我學下野吧.   
我聽日試下比較下兩種 syntax, 睇下出黎既 plan 同 performance 有幾大分別.
作者: snoopy11hk    時間: 2016-3-31 22:38

本帖最後由 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
作者: Super169    時間: 2016-3-31 22:42

我唔係太想去 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 掛.
作者: snoopy11hk    時間: 2016-3-31 22:49

本帖最後由 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 多一次
作者: toylet    時間: 2016-3-31 22:53

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

不關學嘢事, 兮要資料清清楚楚一眼睇到!
作者: lulufish    時間: 2016-3-31 23:17

#8應該冇問題
https://docs.oracle.com/cd/B1930 ... 00/functions137.htm
作者: Super169    時間: 2016-3-31 23:35

我當係咁行先
其實呢句就咁睇已經係 唔合符 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 太長難睇, 我一陣再解釋比你聽, 你可以先諗諗點解.  
放心, 我唔係亂咁吹水, 我會比個合理解釋你既.
作者: snoopy11hk    時間: 2016-4-1 00:00

本帖最後由 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
作者: Super169    時間: 2016-4-1 00:06

回覆 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 乜.  

你講得無錯既: "就算咁好彩無錯, 都唔代表思考方式正確."  希望你自己真係明白.
作者: Super169    時間: 2016-4-1 00:15

回覆 39# snoopy11hk


唔該哂 ching, 有機會真係要學下 Oracle 既 syntax.   

因為我目上面 #20 樓主講話用 rownum, 我跟住都用番 rownum (死, 睇番上面, 原來我打左 recnum, 唔好意思, 希望你知道我係想講乜.)
如果 rowid 至係 record insert 既 order, 咁就用 rowid 代替.

Oracle group 果陣 select 既野一都要 group 度出現?  呢樣真係唔知添.  咁條 sub-query 都唔成立了.
唔可用到 group 既特性, 就要寫多少少了.  睇下點樣可以一句過先, 唔用 group, 就要 sub-query 做手腳.

但係你果句做 sorting 又有問題, 否則唔用 input_date 改成 rowid 就得出結果.    始終接受唔到為左 min 去做 sorting 呢樣咁有破壞性既 SQL.
作者: Super169    時間: 2016-4-1 00:17

#8應該冇問題
lulufish 發表於 2016-3-31 23:17



句法無問題, 針對呢題既答案或者都無問題, 但本身存在問題.
唔係講笑既, 應該要避免犯呢D錯, 後果可大可小.
作者: Super169    時間: 2016-4-1 00:23

回覆 39# snoopy11hk



開始明白你點解話要 min, min, min 佢地了.
忽然有個想法, 因為 having 既結果係 unique record, group 左都係一條, SELECT 果下加個最簡單既 aggregate function (e.g min) 比佢唔知得唔得.

咁樣做有 D 畫蛇添足, 明明得一條 row, 但就叫佢 min(x) 之類, 總係睇落怪怪地, 同埋會浪費左D資源 (一條 row 做 min, 佢都應該照 search).  就算出到答案, 都唔係咁好.

不過, 我都想知 Oracle 既 syntax 受唔受?
作者: snoopy11hk    時間: 2016-4-1 00:24

回覆  snoopy11hk


唔好意思, 原來 #8 係你提供既, 我 miss 左, 仲成日叫你比 sample 我, 呢樣係我錯.
見 ...
Super169 發表於 2016-4-1 00:06


1, 2/input_date 唔 unique, 答案未必 deterministic, 可以 random 咁 A or B
呢個問題要交番去 design db果個,
要 deterministic 的可以用 rowid/ primary key

當然需唔需要就由樓主的DBA 決定

3/ Performance 呢家野你少擔心好了
連 SQL 都未行得郁你擔心點 改好過了

4/ 睇黎你唔明 analytic function 做的野
而家個問題係要揾第一條, 係要揾哂 related 的先知邊條係第一條
以 performance 黎講係無得慳
作者: snoopy11hk    時間: 2016-4-1 00:27

本帖最後由 snoopy11hk 於 2016-4-1 00:28 編輯
回覆  snoopy11hk



開始明白你點解話要 min, min, min 佢地了.
忽然有個想法, 因為 having 既結果係 uni ...
Super169 發表於 2016-4-1 00:23


好大機會 compile 行唔到, 又有機會 runtime error 出黎, 又有機會無病無痛
不過多數都 compile 唔到, 好少時間 runtime error/ 無 error 出

係, min, max 佢地實在解唔通, 只可以話係 dirty tricks, 個人實在不敢荀同
作者: snoopy11hk    時間: 2016-4-1 00:30

回覆  snoopy11hk


唔該哂 ching, 有機會真係要學下 Oracle 既 syntax.   

因為我目上面 #20 樓主講話 ...
Super169 發表於 2016-4-1 00:15



    row id 係 row's physical id
呢個問題要睇個 table 係咪 append 入去定 有 specific sequence 咁 insert
當然我只係好簡單左咁 assume 係 append 落去
作者: Super169    時間: 2016-4-1 00:31

唔理 performance, 最醜惡可以咁寫 (即係之前 #25 講搵無人細過你既做法) ...

SELECT *
  FROM <table> a
WHERE NOT EXISTS (SELECT 0
                     FROM <table> b
                                        WHERE a.account_no = b.account_no
                                          AND a.rowid > b.rowid)

呢下真係好睇  optimizer 識唔識化成 group 去做, 否則會有好大既 performance issue.
作者: snoopy11hk    時間: 2016-4-1 00:35

本帖最後由 snoopy11hk 於 2016-4-1 00:37 編輯
唔理 performance, 最醜惡可以咁寫 (即係之前 #25 講搵無人細過你既做法) ...

SELECT *
  FROM  a
WHERE  ...
Super169 發表於 2016-4-1 00:31

同我的諗法唔同之處係我唔覺得要做個 Anti Join (Not Exists)
因為 anti join 都係 semi join
我只係需要一個 sorting 去 cross reference 上下面的 row 入面的資料
除非個 table 太大, 做一次 window sort 貴過 anti join 好多
我唔會特別用呢條
作者: Super169    時間: 2016-4-1 00:41

同我的諗法唔同之處係我唔覺得要做個 Anti Join (Not Exists)
因為 anti join 都係 semi join
我只係需要 ...
snoopy11hk 發表於 2016-4-1 00:35


我都講左, 我果句係有 performance issue 既.  係唔理 performance 寫出黎.
同你果句都係, 做到答案, 唔代表就係好.
分別只係在於,寫既人知唔知問題所在.
作者: Super169    時間: 2016-4-1 00:45

1, 2/input_date 唔 unique, 答案未必 deterministic, 可以 random 咁 A or B
呢個問題要交番去 design d ...
snoopy11hk 發表於 2016-4-1 00:24



1/2: 夠資料就做到, 唔夠就要答做唔到.  唔好意思, 好難接在不確定情況下, 是旦比一條人都叫答案.
     我再三講過, 唔應該睇住答案做野.  你有咁既習慣, 我無野講.
         你之前講句果野, 真係無錯架, 希望你唔好只係講完就算: "就算咁好彩無錯, 都唔代表思考方式正確."  

3: 家陣講緊你果句 SQL, 我以為你試過 work 既, 所以至諗 performance.  

4: 搵第一條, 同要 sort 哂既分別都唔知?  無得慳? 唔係呀?  你講真定講笑架?
   你試下寫段 code, 比個 array 你, 搵最細果條出黎, 同先排哂全部 record, 再搵第一條出黎, 睇下有幾大分別.
作者: snoopy11hk    時間: 2016-4-1 00:48

我都講左, 我果句係有 performance issue 既.  係唔理 performance 寫出黎.
同你果句都係, 做到答案, 唔 ...
Super169 發表於 2016-4-1 00:41



    以下只係個人經驗:
唔太喜愛 exists (id>id) 呢個 pattern, 唔太直觀

就算
SELECT
FROM (SELECT *, ROW_NUMBER().....  FROM .....)
WHERE row_num = 1
呢個都其實係 oracle 好常見的 pattern
asktom 好, stackoverflow 好, 都好常見呢個答案
作者: Super169    時間: 2016-4-1 00:56

以下只係個人經驗:
唔太喜愛 exists (id>id) 呢個 pattern, 唔太直觀

就算
SELECT
FROM (SELECT * ...
snoopy11hk 發表於 2016-4-1 00:48



問題在於行到同好唔好既分別.  之前講過, 交功課既 OK, 無問題的.

我想知 Oracle 接唔接受我 #38 果句 (改番用 rowid):

SELECT recnum, input_date, account_no, product_cd, agent
  FROM <table>
WHERE rowid IN (SELECT min(rowid)
                    FROM <table>
                                   GROUP BY account_no
                                 )
   
呢句係原本 GROUP 果句拆成 sub-query 既寫法.  等同於我 group by having rowid  = min(rowid)
不過, GROUP BY 果下, 無 SELECT account_no, 唔知 Oracle 受唔受.
作者: snoopy11hk    時間: 2016-4-1 00:57

1/2: 夠資料就做到, 唔夠就要答做唔到.  唔好意思, 好難接在不確定情況下, 是旦比一條人都叫答案.
      ...
Super169 發表於 2016-4-1 00:45



    1,2/: Oracle 自己有 mechanism, 果 D 唔深入探討
我自己個 fault tolerance 就係真係好 exceptional 的錯都無計
generally 99.9999999% 無事就 ok

3/ 呢個 Practice 基本上係 best practice..
所以我唔會再點 tune

4/ :你個思維係 procedural, 我的係 set operation, 無咩野好比較
作者: snoopy11hk    時間: 2016-4-1 01:03

本帖最後由 snoopy11hk 於 2016-4-1 01:07 編輯
問題在於行到同好唔好既分別.  之前講過, 交功課既 OK, 無問題的.

我想知 Oracle 接唔接受我 #38 果句  ...
Super169 發表於 2016-4-1 00:56



呢句照睇 oracle 係compile 到 run 到
如果你想以 performance 講的話, 呢個就正正最好代表
一個 SELECT... FROM WHERE ROWID , 即係一個 row id access
之後一個 inlist  的 select, 即係第二個 table scan

即係 total 1.5-2 table scan

而我的 solution 就係一個 table scan + 一個 window sorting

其實真係好睇個人喜好
但我個人就覺得用 window sorting 好直觀, 唔洗諗太多野

但同一樣的道理, oracle 都可以 insert 錯 sequence
所以要解決呢個問題, 一係改 DB setting, 一係改 table schema
呢個唔係 programmer/software developer 要解決的 level.
作者: Super169    時間: 2016-4-1 01:07

1,2/: Oracle 自己有 mechanism, 果 D 唔深入探討
我自己個 fault tolerance 就係真係好 exceptiona ...
snoopy11hk 發表於 2016-4-1 00:57


你果個唔係乜野 exceptional 既錯, 係亂咁將 D 野比人.  
連會比邊條 row 出黎自己都唔肯定, 咁都叫 99.99999999% 無事?  你真係咁好彩?

行唔到既好易知, program 未出街就應該執走左.  但係 performance issue 往往係用左一排至會出現, 好多人都忽略, 但唔代表就係好既.    可能我對慣既 table 都係好大 volume, 有錯既 SQL 試兩試就睇得出, 基本上睇 SQL 只係睇 performance.

或者只可以咁講, 真係你好好彩, 可以唔去諗 performance.  
但係, 我相信你將來總有一天, 要學下對 performance 負責任的.
作者: Super169    時間: 2016-4-1 01:30

回覆 54# snoopy11hk


無錯, 我果句會 scan 兩次, 如果一句 group 做到, 睇 optimzer 係有可能一次 scan 就得, 可惜 Oracle 唔受.
只好拆開先搵 min (掃一次), 再搵番 D row 出黎(掃一次), 結果要掃兩次.  
因為假設無 index, 每一次都要掃哂至知, 所以要掃兩次.

但係同 sort 比, sort 肯定無可能快過一次 table scan, 而且係慢好多.
我諗你讀書點都有寫過 sorting 既 program 掛, sorting 同 搵 min 既分別有幾大, 你真係唔知?  係既話真係無野好講了.

做唔到同唔去做係兩回事, programmer 除左要寫個 work 既 program 出黎, 亦都有負責任寫好佢.
performance tuning 係其中一個好重要既環節, 亦係 programmer 應該要識既.
呢樣野唔可以話個人喜好, 對成個 system 影響可大可小.....除非只係做下功課, 有問題都只係影響自已既成績.

至於你講到話 oracle 都可以 insert 錯 sequence, 好似有點過火了.
如果我之前講既野有得罪之處, 請多多包涵.  希望大家理性點.
作者: Super169    時間: 2016-4-1 01:47

唔好意思, 唔知 ching 可唔可以幫忙試多樣.

之前話呢句 xyz 無用 aggregate function 包住唔得, 我都明白既, 因為 group 既結果唔可以出現 duplicate row under 個 group.
  1. SELECT rowid, account_no, x, y, z
  2. GROUP BY acount_no
  3. HAVING rowid = min(rowid)
複製代碼
咁如果用個 min 去包住佢地, 又得唔得呢?
  1. SELECT rowid, account_no, min(x), min(y), min(z)
  2. GROUP BY acount_no
  3. HAVING rowid = min(rowid)
複製代碼
我唔係話呢句好, 因為多左個多餘既 min, 睇 code 會亂.  而且又無端端 call 多層.
我只係想知道下 Oracle 食唔食呢個 syntax, 因為相對 sub-query 果個, 呢度有機會快 D.
而且 optimizer 有可能做到scam table 一次, 再 dummy scan result set 一次就得.
作者: snoopy11hk    時間: 2016-4-1 01:58

回覆  snoopy11hk


無錯, 我果句會 scan 兩次, 如果一句 group 做到, 睇 optimzer 係有可能一次 scan 就 ...
Super169 發表於 2016-4-1 01:30


1/ window sort 同 sort 有分別

2/  1.5-2 個 table scan 快定 1 個 table scan + window sort 快, 其實係 case by case 仲要好 marginal
, 不值一提


3/    無過左火, non deterministic 的意思就係咁簡單
你就算 select 出黎唔同時間都可以唔同 order
只不過你好少時間會見到真係唔同咁解

要講到好 detail 我就真係唔想講, 係呢個 post 都唔需要, 所以我唔想搞到太 complicated 要講呢 D
最簡單, 你落個 Primary Key 落去, 佢成個 natural sorting 都會變哂

落 index 好似又會
作者: Super169    時間: 2016-4-1 02:14

1/ window sort 同 sort 有分別

2/  1.5-2 個 table scan 快定 1 個 table scan + window sort 快, 其實 ...
snoopy11hk 發表於 2016-4-1 01:58


呢度有樣野我講錯左, 要更正番.  
我果句 SQL, 應該唔係 2 次.  可以係好多次, 又可以係好快.
原因:
兩次只係講 main table, 但係佢仲要去搵 result set 對, 如果第一下出既 result set 好大 (完全無得 group), 就會變左 每條做一次 search, search 結果係 1+2+3+4.... 即係 n 條 row 就對 n(n+1)/2 次.
但又有可能好快既原因, 係要睇 Oracle 既設計.  一般 rowid 都係 index 左既, 正路 SQL server 如對 where 既 field 係 index 左, 佢會由 result set 搵番轉頭.  就變成係 scan result set 再 index search main table.

唔好下下 case by case 就算, 係咁簡單, 就唔駛日做 tuning 喇.
可能我會令你煩左 D, performance 既野, 同樓主既要求無關.
不過, 習慣左成日要 tune 野, 睇 SQL 第一時間係睇會唔會慢左, 無 index 既 table 比較少玩, 樓主既 case 就當成係咁去諗.
作者: snoopy11hk    時間: 2016-4-1 02:59

本帖最後由 snoopy11hk 於 2016-4-1 03:19 編輯
呢度有樣野我講錯左, 要更正番.  
我果句 SQL, 應該唔係 2 次.  可以係好多次, 又可以係好快.
原因:
兩次 ...
Super169 發表於 2016-4-1 02:14


基本上有 D 題型的問題, 用 pattern/cookbook  就 ok , 唔洗特別去諗 tuning
唔係最快都會係快

倒不如留番時間, 有時 D complex 的 query 連 optimizer 都搞唔掂先出手啦
果 D就真係好哂時間 同心機
作者: snoopy11hk    時間: 2016-4-1 03:12

唔好意思, 唔知 ching 可唔可以幫忙試多樣.

之前話呢句 xyz 無用 aggregate function 包住唔得, 我都明白 ...
Super169 發表於 2016-4-1 01:47


你個 row id 都唔係 group by 啦
唔洗試都知 唔 work

min, max 呢 D 係得
但係多過一條就會錯, 仲唔止
無啦啦要 min max, 唔熟 sql 的人, 睇到人眼花都唔知係 dirty tricks
一有 bug 的時候你就唔慌要重寫過成個 query
太唔直觀的時候有時慳左 performance 但蝕左 maintenance
作者: Super169    時間: 2016-4-1 09:52

你個 row id 都唔係 group by 啦
唔洗試都知 唔 work

min, max 呢 D 係得
但係多過一條就會錯, 仲唔止
...
snoopy11hk 發表於 2016-4-1 03:12


ching 你唔係咁趣緻呀.

如果你話 SELECT 既 rowid 唔係 group by. 知道做緊乜既, 都知對應點改番.
我無得試, 而你之前只係話 xyz 唔得, 所以只係改左 xyz.

我一早都講左, 加個 min 會令睇 code 既人亂, 我只係純粹想睇下佢食乜野 syntax.
你又拋書包咁將我講既野演譯一次, 你係想話比我聽, 你吸收到我講乜?  定係話你無睇人講乜?
唔好只係將學到既野死背, 真係咁係都唔駛執我口水尾講番比我聽掛.

我果度會唔會多過一條....你唔係睇唔出掛?  
對 unique field 搵 min 會有機會多過一條? ching 玩左 SQL 幾耐, 仲會有咁既想法?
至於話會唔會亂, 睇你熟唔熟 GROUP 入面既 function 係點做.  
有 D 人甚至可能會以為 min 係 global 既 min 都得, 呢樣我都控制唔到.
當然, 我無話咁寫係好, 只係想了解個 engine 多 D.
明白一個 engine 點做野, 先至唔會做錯野, 可以做到合適既 tuning.
唔識又唔去諗既人, 你是旦寫句複雜少少既 SQL, 佢都會睇唔掂架啦.

最起碼咁樣做, 係有根據去做出黎, 結果係可以預知, 反而唔會出錯 (當你明白背後原因就知, 唔信你可以用唔同既 data 去試).

總好過你既做法, 就算唔睇 performance, 個答案都只係搏好彩中左, 而唔係必然既.

不過, 又試下幫你兜番喇 (我初時以為你會識咁諗, 但你上面既回應, 好明顯真係搏好彩)
你果句中既原因有可能係 Oracle 排完 GROUP 入面既野, 出現重複, 就自動跟輸入次序.
呢樣唔奇, 有 D engine 會咁做, 因為點都要有個之序出比人.
(記住, 上面既野係我講既, 唔好陣間又當正有新發現, 講番比我知.)

不過, 就算 Oracle 既 engine 講明有咁既特性, 你果句都係唔好, 可以好易去 tune 好 D. (只係基於你比出黎既野, 同埋上面既假設去 tune, 唔係大執).

點解?  比你思考一下, 遲 D 至答.  
你就當多左個大前提, 係 GROUP 果陣重複就會自動用輸入次序去排. (反正你果句都要靠呢樣野至 work, 就當佢成立.)
多 D 去研究下 SQL 既細節, 可以改善你寫野既效率.  唔好只係中左個答案就算.
作者: Super169    時間: 2016-4-1 11:02

本帖最後由 Super169 於 2016-4-1 11:09 編輯

忽然又諗到樣野 (同上面講點改你果句無關, 兩者可以結合, 但唔好攪亂)

唔知 Oracle 會唔會 support "SELECT FIRST" 或者 "SELECT TOP" 之類既 syntax?

如果得既, 你直接 SELECT FIRST 1 a.* OVER PARTITION ... 受唔受?
呢下真係唔知既, 純粹想學下野. 因為 SELECT FIRST 既 FIRST 未必可以對應 PARTITION 去做, 結果就有可能會針對成個 result set, 變成得番一條, 唔 work.  要睇 SELECT FIRST 再 OVER 會點演譯.

如果得既, 就唔駛拆開 sub-query, 亦都唔駛完全排序.

一般 support 得 SELECT FIRST, optimizer 都可以掃一次就出.  因為只要 keep 住最前既, SELECT FIRST 1 就等同於搵 min, 一直掃, 有需要就換, 只需要 one pass 就得, 唔需要完全排哂.  呢個亦係 SELECT FIRST 既好處, 唔需要做一個 full 既 result set 出黎.
作者: snoopy11hk    時間: 2016-4-1 13:03

本帖最後由 snoopy11hk 於 2016-4-1 13:15 編輯
忽然又諗到樣野 (同上面講點改你果句無關, 兩者可以結合, 但唔好攪亂)

唔知 Oracle 會唔會 support "SELEC ...
Super169 發表於 2016-4-1 11:02



    oracle 有 stop key 的野, 但係基本上只用係not exists/ exists/ rownum<=/analytic function
作者: snoopy11hk    時間: 2016-4-1 13:10

ching 你唔係咁趣緻呀.

如果你話 SELECT 既 rowid 唔係 group by. 知道做緊乜既, 都知對應點改番.
我無 ...
Super169 發表於 2016-4-1 09:52



    會唔會多過一條, 我之前的post 都有講
有好細的機會, 一條都可以過到 compile 到, 行到 (係 stored procedure)
再大的機會就係出 ora error, 過唔到
呢隻 ora error 唔係 runtime error 黎, 係 pre process error 黎

deterministic 唔係咁去 determine
deterministic 係靠 sufficient condition 去 bound 住佢
作者: Super169    時間: 2016-4-1 13:53

會唔會多過一條, 我之前的post 都有講
有好細的機會, 一條都可以過到 compile 到, 行到 (係 stored  ...
snoopy11hk 發表於 2016-4-1 13:10



如果一個 unique field 既 min 都唔 sufficient, 我真係唔知你想講乜了.
你講到個 server 連 unique 既野都可以出兩條, 呢樣就真係你前面講, 唔係我地呢D programmer 要負責的了.  如果連呢D都講, 根本就唔可以信個 db engine, 咁仲有乜好做.  你都可以話佢 sort / group 一樣可以出錯.  其實大家寫既 SQL, 都係假設個 engine 會跟 spec 做, 否則, 無理由話人地寫既就可能出事, 你寫既就唔會出事.
而且,  unique field 既 min 只有一條 row, 起碼係跟 spec 去講無錯 , 個 engine 出錯係另一回事.  總好過連出乜都唔肯定.

另外, 你諗到我話你果句加多個大前提令你既 result 成立之後, 仲有乜問題嗎?
我都想睇下, 你知唔知自己做緊乜, 同埋 under 唔同既 condition, 你會點做.
作者: chancho    時間: 2016-4-1 16:49

唔知之前有無師兄提過, sql 中的 record 對等的, 無先後之分, 如要有先後便要加一個 timestamp 的 field.
作者: snoopy11hk    時間: 2016-4-1 18:55

本帖最後由 snoopy11hk 於 2016-4-1 18:57 編輯
如果一個 unique field 既 min 都唔 sufficient, 我真係唔知你想講乜了.
你講到個 server 連 unique 既 ...
Super169 發表於 2016-4-1 13:53



咁你好明顥係無睇到頭先你自己講咩
講緊的係 唔落 aggregate function 的 unique field 照行 group by other field 會唔會有事, 講左就話會出事, 行唔到, 會出 ora error
你連 run 都 唔到仲同我講用 unique field 揾 min

用 unique field 揾min 呢隻 pattern 當然有
好多其實 multitable referencing 的 field 都會咁做
為的係 row collapse

呢個 concept 講左好多次aggregate 係用黎做 row collapse
唔要 row collapse 唔好用 aggregate
作者: snoopy11hk    時間: 2016-4-1 18:59

唔知之前有無師兄提過, sql 中的 record 對等的, 無先後之分, 如要有先後便要加一個 timestamp 的 field. ...
chancho 發表於 2016-4-1 16:49


其實連 timestamp 都唔 guarantee 係 unique
係要 Foreign Key + timestamp as a Primary Key 先 unique 到
作者: Super169    時間: 2016-4-2 01:11

咁你好明顥係無睇到頭先你自己講咩
講緊的係 唔落 aggregate function 的 unique field 照行 group by  ...
snoopy11hk 發表於 2016-4-1 18:55



我唔熟 oracle 既 syntax, 但重點係明白做緊乜, 再跟番 syntax 去執.   
唉....連個原理都解釋埋, 你都仲唔識轉既, 我都投降了.  

之前講過你句野有問題, 都應該解釋埋比你聽, 唔好當左我亂吹:

你果句野, 係基於 SQL engine SELECT 一 group 無排序既 data 會用番事入次序至會 work.
(我無話呢句野一定成立, 只係你果 SQL 要基於呢樣野至合理)

- 如果以上唔成立, 你果句野既結果係不能確定, 所以係好大問題既 SQL.  
- 如果以上成立, 你果句野的確可以做出想要既答案.  如果只係要答案, 勉強可以叫 OK.
   不過, 如果以上成立, 你果同樣係有點多餘, 因為既然同一 group 入面, 無排序會跟事入次序, 跟本就唔需要用 input_date 排一次.

所以, 我話你果句好唔掂, 一係就好彩中答案, 一係就自已打自己, 畫蛇添足.

睇你都係做到答案就算既人, 如果唔明白我講乜, 就當我無講過喇.  多多得罪了.
作者: Super169    時間: 2016-4-2 01:33

唔知之前有無師兄提過, sql 中的 record 對等的, 無先後之分, 如要有先後便要加一個 timestamp 的 field. ...
chancho 發表於 2016-4-1 16:49



好多書本 的確會話教人 timestamp 係 unique, 不過, 今次樓上位 ching 無講錯, 今時今日, 係有可能唔 unique.  
唔係話書本錯, 而係時代唔同左, 科技進步哂.
timestamp 同 identity 之類既 sequence number 唔同,   timestamp 係基於時間.
當初出 SQL 既年代, process 一條 SQL 要既時間比家陣長, 而 timestamp 一般可以去到千分一秒或者更細, 係當時, 基本上變相可以令到 timestamp 變成 unique.   
但係今時今日, 睇下你用乜野機, 如果檯頭部機去行 SQL server, 用 timestamp 當 unique 都話者 OK.  但係, 如果用部 勁既 server, 就有機會同一個時間單位內, 處理到超過一條 insert, 結果就有可能 duplicate 了.  除非個 engine 加入一D logic 令佢多 D 變化, 不過有違當初用 timestamp 簡單做出 unique key 既原意了.

如果你明白 duplicate 既原因, 你認為加個唔 unique 既 foreign key, 會唔會肯定係可以變成 unique 呢?
結果只係減低機會率, 而唔係完全避免.  又係睇彩數既做法, 鐘意賭運既無計, 不過就盡量唔好喇.
作者: snoopy11hk    時間: 2016-4-2 01:33

本帖最後由 snoopy11hk 於 2016-4-2 01:44 編輯
我唔熟 oracle 既 syntax, 但重點係明白做緊乜, 再跟番 syntax 去執.   
唉....連個原理都解釋埋, 你都 ...
Super169 發表於 2016-4-2 01:11


睇黎最大問題係你連成個 analytic function 都唔識, 雞同鴨講

如果以上成立, 你果句野的確可以做出想要既答案.  如果只係要答案, 勉強可以叫 OK.
   不過, 如果以上成立, 你果同樣係有點多餘, 因為既然同一 group 入面, 無排序會跟事入次序, 跟本就唔需要用 input_date 排一次.


ROW_NUMBER( )
   OVER ([ query_partition_clause ] order_by_clause)

order_by_clause 係 mandatory 的 clause

我唔知你係到執呢 D  syntax 野有咩意思

- 如果以上唔成立, 你果句野既結果係不能確定, 所以係好大問題既 SQL.


你連最基本的 deterministic 都 唔清楚, 就係話好大問題
最簡單的 row insert principle 都係到 described as "過左火"
根本無 dbms 會話俾你聽, 邊條 row 會係邊個位
要做的, 自行construct 個 primary key 去 ensure 番

唔係的, 我點解要 care deterministic?
rubbish in rubbish out
我做左 design by contract 所要求的野
你個 table rubbish 左, 當然就 rubbish out
作者: Super169    時間: 2016-4-2 01:38

睇黎最大問題係你連成個 analytic function 都唔識, 雞同鴨講



ROW_NUMBER( )
   OVER ([ query_partit ...
snoopy11hk 發表於 2016-4-2 01:33



你好似仲係唔明, 我一直都唔係執緊 syntax (我根本就唔熟 Oracle 既 syntax, 點執?), 我係針對緊 requirement 同 performance  去諗 SQL.  
之前都講過, syntax 好易試, 有機既打入去行就得, 無乜好執.  反而 明白個原理, 去做一條好既 SQL 至有意思.
作者: snoopy11hk    時間: 2016-4-2 01:53

本帖最後由 snoopy11hk 於 2016-4-2 01:59 編輯
你好似仲係唔明, 我一直都唔係執緊 syntax (我根本就唔熟 Oracle 既 syntax, 點執?), 我係針對緊 requir ...
Super169 發表於 2016-4-2 01:38



    你話你唔係執緊 syntax,
同我講 oracle order_by_clause 係無必要
, 係有點多餘
係你唔明白 點解 order by clause 有存在的必要

其實講左咁耐, 最簡單要做 optimization 必須要做的野就係試
麻煩師兄 俾個  tkprof 睇下
咁先有意義
作者: snoopy11hk    時間: 2016-4-2 02:11

好多書本 的確會話教人 timestamp 係 unique, 不過, 今次樓上位 ching 無講錯, 今時今日, 係有可能唔 un ...
Super169 發表於 2016-4-2 01:33



    仲有要加埋落 Unique Constraint/ Primary Key
咁先 ensure 到 一定無任何 duplicate primary key
作者: Super169    時間: 2016-4-2 02:35

睇黎最大問題係你連成個 analytic function 都唔識, 雞同鴨講



ROW_NUMBER( )
   OVER ([ query_partit ...
snoopy11hk 發表於 2016-4-2 01:33



rowid 或者係 rownum 之類, 如果係 system 自己送既 unique identifier, 就應該自己會 handle duplication.
如果你話加個 primary key 可以 ensure 到, 咁就係自己打自己了, 一方面你相信加個 primary key 佢個 engine 可以 識 check duplication, 另一方面你又覺得佢自己做既 identifier 可能會 duplicate.

table rubbish, 作為一個 programmer, 唔係要做番個 rubbish out, 而係應該同要求既人講番點解佢個 table 係 rubbish.   當然, 唔去諗就交 D rubbish 比人, 可能係你至會覺得正常.
作者: snoopy11hk    時間: 2016-4-2 02:44

本帖最後由 snoopy11hk 於 2016-4-2 02:46 編輯
rowid 或者係 rownum 之類, 如果係 system 自己送既 unique identifier, 就應該自己會 handle duplicati ...
Super169 發表於 2016-4-2 02:35



    我係指如果要 no duplication 係要落 constraint/primary key,唔係靠咩unique identifier 去 做 sorting

用 rowid 只係最後一招, 平日唔會用, rowid 算係 dirty tricks 黎, 無啦啦要用 row unique identifer, 即係 design 有問題

正路用rowid 只係用黎將 table 的 row 分批 process

table rubbish 作為一個 programmer 可以俾 advice, 但同樣都要兩手準備
起碼未 fix 到前都有 D 野交到貨
deliver on time 係問題黎
作者: Super169    時間: 2016-4-2 02:46

仲有要加埋落 Unique Constraint/ Primary Key
咁先 ensure 到 一定無任何 duplicate primary key ...
snoopy11hk 發表於 2016-4-2 02:11



又係同一個毛病了.

加 unique constraint 去叫個 engine 避免加入 duplicate key, 但唔代表你做出黎既 key 係 unique.
只不過, 當你做出 duplicate 既既 key 又想 insert 入去果陣, 佢會 reject 你.

同之前一樣, 既然要落 unique constraint, 又駛乜加個 foreign key 喎.  
你既問題係只要 syntax 無錯, 結果無錯, 就好鐘意叫個 server 做無謂野.

真係投降了, 大家睇既方向唔同.  你只係需要做到就算, 所以只係放眼於個 syntax work 唔 work.   
無錯, 你咁樣做係可以寫到一句唔死既 SQL.  
不過, 當你寫左一段時間之後, syntax 呢樣野, 根本唔需要諗太多, 寫慣左就好少會錯, 而且有錯都好易執出黎.
如果想改善既, 就應該去諗下個 engine 點做, 點樣可以善用個 engine 去寫野.  
好多野, 唔係書本會有既.  只係拋書包, 結果只係會綁住自己.  連自己寫既野, 背後有乜野假設至成立都唔知, 好難要求你諗太多.

家陣點同你講, 你都係走唔出個框, 我投降了.  
而且, 講 Oracle 你比我熟, 我好難憑空去試下佢點做野, 你就當我講既係廢話, 用番你既方法去諗喇.
作者: snoopy11hk    時間: 2016-4-2 03:00

又係同一個毛病了.

加 unique constraint 去叫個 engine 避免加入 duplicate key, 但唔代表你做出黎既  ...
Super169 發表於 2016-4-2 02:46


其實我一直的建議係 Foreign Key + Timestamp As Primary Key (Cookbook mode)
Primary Key 包 unique constraint
咁就 ensure 一定無 deterministic problem (你成日擔心的野)

我都會睇佢 overhead 大唔大, 唔大的話, 無咩需要去 tune
正如一開始講
其實 full table scan + window sort
同自己諗的最快差幾遠

當呢 D optimizer 可以自己搞掂你都哂時間去 optimize
咁點有咁多時間去 optimize optimizer 都 optimize 唔到的 query?

拋書包係你唔理解dbms做緊咩定你諗多左野?
好多野就好似佢咁寫, non deterministic 就係 non deterministic
你見到佢好似 deterministic 就假設係 deterministic 咁咪出事囉
你連佢 guarantee 緊 D  咩都唔清楚, 咁點討論落去?
作者: Super169    時間: 2016-4-2 03:02

我係指如果要 no duplication 係要落 constraint/primary key,唔係靠咩unique identifier 去 做 sor ...
snoopy11hk 發表於 2016-4-2 02:44



本來唔想再回 SQL 既野, 不過有 D 工作態度既問題, 都係忍唔住口.  
可能大家做野既取態唔同, 如果明知做出黎既野有問題, 我會先同個客講清楚, 如果佢堅持要垃圾就做, 會係 spec 講明係有乜野垃圾至做.  否則寧願唔交貸, 都唔會唔聲唔聲比舊垃圾人.
作者: snoopy11hk    時間: 2016-4-2 03:11

本來唔想再回 SQL 既野, 不過有 D 工作態度既問題, 都係忍唔住口.  
可能大家做野既取態唔同, 如果明知 ...
Super169 發表於 2016-4-2 03:02


有得唔做梗係唔做啦,
保障自己的 assumption 係人都識寫啦

我都無叫你比舊垃圾俾人
但在商, timely delivery 都好重要,
無可能下下都 estimate 得好足 D 野
作者: Super169    時間: 2016-4-2 04:12

有得唔做梗係唔做啦,
保障自己的 assumption 係人都識寫啦

我都無叫你比舊垃圾俾人
但在商, timely del ...
snoopy11hk 發表於 2016-4-2 03:11


所以我咪講左, 呢個係取態問題囉.  無話邊個對錯的, 每個人都可以有自已既選擇.
我只係想比個忠告你, 對自己既 program 負責任.

我既選擇係寧願唔做, 都唔會明知垃圾出比人.
個客唔講道理要你做既, 一係就講明有乜問題, 大家 black and white agree 左至去, 否則最多唔做佢既 job.  

自己唔知無得講, 明知係垃圾出比人, 做臭自己不如唔好做, 時間絕對唔係一個借口.
做得呢行, 自己要識得計 resource.
如果係自己計得唔好, OT 都追唔番, 咪直接同個客講認衰. 個客要嘈, 甚至要賠都無計.
Timely delivery 既大前提係無做錯野, 唔可以因為無時間趕出貨就比件垃圾人.  呢個只係借口, 唔係理由.

當然, 大家取態唔同, 你絕對有權選擇只係睇準時交貨, 無話對定錯既.
作者: snoopy11hk    時間: 2016-4-2 20:26

所以我咪講左, 呢個係取態問題囉.  無話邊個對錯的, 每個人都可以有自已既選擇.
我只係想比個忠告你, 對 ...
Super169 發表於 2016-4-2 04:12



    多謝塞錢入袋
作者: henrywho    時間: 2016-4-7 13:40

table 本身有記錄每條 record 既row number 的, 唔駛特別加.
我叫日日野 發表於 2016-3-30 22:53


Oracle 嘅 rownum 同 row_number() 應該唔係用嚟攞 "所有 account 既第 n 條 record" 囉.....
作者: 柏斯    時間: 2016-4-17 15:53

請教各位ching, 我有個 table如圖(有顏色的部份),
每個 &quot;account_no&quot; 我只係想出佢第一條既 record, 其他唔 ...
我叫日日野 發表於 29/3/2016 15:58


    oracle有個rank()嘅function,應啦做到你嘅requirement
作者: evo4b    時間: 2016-4-18 22:50

oracle有個rank()嘅function,應啦做到你嘅requirement
柏斯 發表於 2016-4-17 15:53


RANK() over (partition by) 唔得
因為會出現DUPLICATE RECORD

Select a.ID
, a.score
, rank() over(order by score desc)
from table a;

ID  SCORE  Rank
1    100       1
2    99         3
3    100       1

當你用RANK=1 抽RECORD 時,就會將ID=3, ID=1兩條抽晒出黎
作者: ykmran    時間: 2016-4-18 23:01

睇一個咁簡單既問題有咁多個reply,就知有花生食
作者: snoopy11hk    時間: 2016-4-19 20:46

睇一個咁簡單既問題有咁多個reply,就知有花生食
ykmran 發表於 2016-4-18 23:01


齊齊食花生先





歡迎光臨 電腦領域 HKEPC Hardware (https://www.hkepc.com/forum/) Powered by Discuz! 7.2