Documentation Source Text

Hex Artifact Content
Login

Artifact 3d4d7fc5973b48a523b3538595d0a6e4cddd9500fa9bbcedef923e332a4aa962:


0000: 3c 74 63 6c 3e 68 64 5f 6b 65 79 77 6f 72 64 73  <tcl>hd_keywords
0010: 20 7b 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f   {window functio
0020: 6e 73 7d 3c 2f 74 63 6c 3e 0a 0a 3c 74 69 74 6c  ns}</tcl>..<titl
0030: 65 3e 53 51 4c 69 74 65 20 53 51 4c 20 57 69 6e  e>SQLite SQL Win
0040: 64 6f 77 20 46 75 6e 63 74 69 6f 6e 20 53 75 70  dow Function Sup
0050: 70 6f 72 74 3c 2f 74 69 74 6c 65 3e 0a 3c 74 61  port</title>.<ta
0060: 62 6c 65 5f 6f 66 5f 63 6f 6e 74 65 6e 74 73 3e  ble_of_contents>
0070: 0a 0a 3c 68 32 20 73 74 79 6c 65 3d 22 6d 61 72  ..<h2 style="mar
0080: 67 69 6e 2d 6c 65 66 74 3a 31 2e 30 65 6d 22 20  gin-left:1.0em" 
0090: 6e 6f 74 6f 63 20 69 64 3d 6f 76 65 72 76 69 65  notoc id=overvie
00a0: 77 3e 20 4f 76 65 72 76 69 65 77 3c 2f 68 32 3e  w> Overview</h2>
00b0: 0a 0a 3c 70 3e 54 68 69 73 20 70 61 67 65 20 64  ..<p>This page d
00c0: 65 73 63 72 69 62 65 73 20 74 68 65 20 73 75 70  escribes the sup
00d0: 70 6f 72 74 20 66 6f 72 20 53 51 4c 20 77 69 6e  port for SQL win
00e0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 64  dow functions ad
00f0: 64 65 64 20 74 6f 20 53 51 4c 69 74 65 0a 5b 76  ded to SQLite.[v
0100: 65 72 73 69 6f 6e 20 33 2e 32 35 2e 30 5d 20 28  ersion 3.25.0] (
0110: 5b 64 61 74 65 6f 66 3a 33 2e 32 35 2e 30 5d 29  [dateof:3.25.0])
0120: 2e 20 53 51 4c 69 74 65 27 73 20 77 69 6e 64 6f  . SQLite's windo
0130: 77 20 66 75 6e 63 74 69 6f 6e 20 73 75 70 70 6f  w function suppo
0140: 72 74 20 69 73 20 63 6c 6f 73 65 6c 79 0a 6d 6f  rt is closely.mo
0150: 64 65 6c 65 64 20 6f 6e 20 74 68 61 74 20 6f 66  deled on that of
0160: 20 3c 61 20 68 72 65 66 3d 68 74 74 70 3a 2f 2f   <a href=http://
0170: 77 77 77 2e 70 6f 73 74 67 72 65 73 71 6c 2e 6f  www.postgresql.o
0180: 72 67 3e 50 6f 73 74 67 72 65 53 51 4c 3c 2f 61  rg>PostgreSQL</a
0190: 3e 2e 0a 0a 3c 68 31 3e 49 6e 74 72 6f 64 75 63  >...<h1>Introduc
01a0: 74 69 6f 6e 20 74 6f 20 57 69 6e 64 6f 77 20 46  tion to Window F
01b0: 75 6e 63 74 69 6f 6e 73 3c 2f 68 31 3e 0a 0a 3c  unctions</h1>..<
01c0: 70 3e 41 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  p>A window funct
01d0: 69 6f 6e 20 69 73 20 61 20 73 70 65 63 69 61 6c  ion is a special
01e0: 20 74 79 70 65 20 6f 66 20 53 51 4c 20 66 75 6e   type of SQL fun
01f0: 63 74 69 6f 6e 20 66 6f 72 20 77 68 69 63 68 20  ction for which 
0200: 74 68 65 20 72 65 73 75 6c 74 73 0a 64 65 70 65  the results.depe
0210: 6e 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  nd on the conten
0220: 74 73 20 6f 66 20 61 20 22 77 69 6e 64 6f 77 22  ts of a "window"
0230: 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   of one or more 
0240: 63 6f 6e 74 69 67 75 6f 75 73 20 72 6f 77 73 20  contiguous rows 
0250: 72 65 74 75 72 6e 65 64 0a 62 79 20 74 68 65 20  returned.by the 
0260: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
0270: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
0280: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2e  window function.
0290: 20 41 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69   A window functi
02a0: 6f 6e 20 6d 61 79 0a 6f 6e 6c 79 20 62 65 20 75  on may.only be u
02b0: 73 65 64 20 69 6e 20 74 68 65 20 73 65 6c 65 63  sed in the selec
02c0: 74 2d 6c 69 73 74 20 6f 72 20 4f 52 44 45 52 20  t-list or ORDER 
02d0: 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  BY clause of a S
02e0: 45 4c 45 43 54 20 6f 72 20 73 75 62 2d 73 65 6c  ELECT or sub-sel
02f0: 65 63 74 0a 63 6f 6e 73 74 72 75 63 74 69 6f 6e  ect.construction
0300: 2e 20 54 68 65 20 73 79 6e 74 61 78 20 66 6f 72  . The syntax for
0310: 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69   a window functi
0320: 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
0330: 20 74 68 61 74 20 66 6f 72 20 61 20 72 65 67 75   that for a regu
0340: 6c 61 72 20 73 63 61 6c 61 72 20 53 51 4c 20 66  lar scalar SQL f
0350: 75 6e 63 74 69 6f 6e 20 65 78 63 65 70 74 20 74  unction except t
0360: 68 61 74 20 69 74 20 69 73 20 66 6f 6c 6c 6f 77  hat it is follow
0370: 65 64 20 62 79 20 61 6e 20 4f 56 45 52 20 63 6c  ed by an OVER cl
0380: 61 75 73 65 2e 20 54 68 65 20 66 75 6c 6c 0a 73  ause. The full.s
0390: 79 6e 74 61 78 20 69 73 3a 0a 0a 3c 63 6f 64 65  yntax is:..<code
03a0: 62 6c 6f 63 6b 3e 0a 20 20 26 6c 74 3b 77 69 6e  block>.  &lt;win
03b0: 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 26 67 74 3b  dow-function&gt;
03c0: 20 20 20 20 20 3a 3d 20 26 6c 74 3b 66 75 6e 63       := &lt;func
03d0: 74 69 6f 6e 26 67 74 3b 28 26 6c 74 3b 61 72 67  tion&gt;(&lt;arg
03e0: 73 2e 2e 2e 26 67 74 3b 29 20 26 23 39 31 3b 26  s...&gt;) &#91;&
03f0: 6c 74 3b 66 69 6c 74 65 72 26 67 74 3b 5d 20 4f  lt;filter&gt;] O
0400: 56 45 52 20 28 26 6c 74 3b 77 69 6e 64 6f 77 2d  VER (&lt;window-
0410: 64 65 66 69 6e 69 74 69 6f 6e 26 67 74 3b 29 0a  definition&gt;).
0420: 0a 20 20 26 6c 74 3b 66 69 6c 74 65 72 26 67 74  .  &lt;filter&gt
0430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a  ;              :
0440: 3d 20 46 49 4c 54 45 52 20 28 57 48 45 52 45 20  = FILTER (WHERE 
0450: 26 6c 74 3b 65 78 70 72 26 67 74 3b 29 0a 0a 20  &lt;expr&gt;).. 
0460: 20 26 6c 74 3b 77 69 6e 64 6f 77 2d 64 65 66 69   &lt;window-defi
0470: 6e 69 74 69 6f 6e 26 67 74 3b 20 20 20 3a 3d 20  nition&gt;   := 
0480: 26 23 39 31 3b 50 41 52 54 49 54 49 4f 4e 20 42  &#91;PARTITION B
0490: 59 20 26 6c 74 3b 65 78 70 72 65 73 73 69 6f 6e  Y &lt;expression
04a0: 2d 6c 69 73 74 26 67 74 3b 5d 20 26 23 39 31 3b  -list&gt;] &#91;
04b0: 4f 52 44 45 52 20 42 59 20 26 6c 74 3b 65 78 70  ORDER BY &lt;exp
04c0: 72 65 73 73 69 6f 6e 2d 6c 69 73 74 26 67 74 3b  ression-list&gt;
04d0: 5d 20 26 23 39 31 3b 26 6c 74 3b 66 72 61 6d 65  ] &#91;&lt;frame
04e0: 2d 73 70 65 63 69 66 69 63 61 74 69 6f 6e 26 67  -specification&g
04f0: 74 3b 5d 0a 0a 20 20 26 6c 74 3b 66 72 61 6d 65  t;]..  &lt;frame
0500: 2d 73 70 65 63 69 66 69 63 61 74 69 6f 6e 26 67  -specification&g
0510: 74 3b 20 3a 3d 20 52 4f 57 53 7c 52 41 4e 47 45  t; := ROWS|RANGE
0520: 20 42 45 54 57 45 45 4e 20 26 6c 74 3b 66 72 61   BETWEEN &lt;fra
0530: 6d 65 2d 62 6f 75 6e 64 61 72 79 26 67 74 3b 20  me-boundary&gt; 
0540: 41 4e 44 20 26 6c 74 3b 66 72 61 6d 65 2d 62 6f  AND &lt;frame-bo
0550: 75 6e 64 61 72 79 26 67 74 3b 0a 0a 20 20 26 6c  undary&gt;..  &l
0560: 74 3b 66 72 61 6d 65 2d 62 6f 75 6e 64 61 72 79  t;frame-boundary
0570: 26 67 74 3b 20 20 20 20 20 20 3a 3d 20 55 4e 42  &gt;      := UNB
0580: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
0590: 0a 20 20 26 6c 74 3b 66 72 61 6d 65 2d 62 6f 75  .  &lt;frame-bou
05a0: 6e 64 61 72 79 26 67 74 3b 20 20 20 20 20 20 3a  ndary&gt;      :
05b0: 3d 20 26 6c 74 3b 65 78 70 72 26 67 74 3b 20 50  = &lt;expr&gt; P
05c0: 52 45 43 45 44 49 4e 47 0a 20 20 26 6c 74 3b 66  RECEDING.  &lt;f
05d0: 72 61 6d 65 2d 62 6f 75 6e 64 61 72 79 26 67 74  rame-boundary&gt
05e0: 3b 20 20 20 20 20 20 3a 3d 20 43 55 52 52 45 4e  ;      := CURREN
05f0: 54 20 52 4f 57 0a 20 20 26 6c 74 3b 66 72 61 6d  T ROW.  &lt;fram
0600: 65 2d 62 6f 75 6e 64 61 72 79 26 67 74 3b 20 20  e-boundary&gt;  
0610: 20 20 20 20 3a 3d 20 26 6c 74 3b 65 78 70 72 26      := &lt;expr&
0620: 67 74 3b 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20  gt; FOLLOWING.  
0630: 26 6c 74 3b 66 72 61 6d 65 2d 62 6f 75 6e 64 61  &lt;frame-bounda
0640: 72 79 26 67 74 3b 20 20 20 20 20 20 3a 3d 20 55  ry&gt;      := U
0650: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
0660: 4e 47 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  NG.</codeblock>.
0670: 0a 3c 70 3e 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .<p>For example,
0680: 20 67 69 76 65 6e 3a 0a 0a 3c 63 6f 64 65 62 6c   given:..<codebl
0690: 6f 63 6b 3e 0a 20 20 43 52 45 41 54 45 20 54 41  ock>.  CREATE TA
06a0: 42 4c 45 20 74 30 28 78 20 49 4e 54 45 47 45 52  BLE t0(x INTEGER
06b0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 20   PRIMARY KEY, y 
06c0: 54 45 58 54 29 3b 0a 20 20 49 4e 53 45 52 54 20  TEXT);.  INSERT 
06d0: 49 4e 54 4f 20 74 30 20 56 41 4c 55 45 53 20 28  INTO t0 VALUES (
06e0: 31 2c 20 27 61 61 61 27 29 2c 20 28 32 2c 20 27  1, 'aaa'), (2, '
06f0: 63 63 63 27 29 2c 20 28 33 2c 20 27 62 62 62 27  ccc'), (3, 'bbb'
0700: 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  );.</codeblock>.
0710: 0a 3c 70 3e 54 68 65 6e 3a 0a 0a 3c 63 6f 64 65  .<p>Then:..<code
0720: 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 54  block>.  <i>-- T
0730: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c  he following SEL
0740: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72 65  ECT statement re
0750: 74 75 72 6e 73 3a 3c 2f 69 3e 0a 20 20 3c 69 3e  turns:</i>.  <i>
0760: 2d 2d 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  -- </i>.  <i>-- 
0770: 20 20 78 20 7c 20 79 20 7c 20 72 6f 77 5f 6e 75    x | y | row_nu
0780: 6d 62 65 72 3c 2f 69 3e 0a 20 20 2d 2d 2d 2d 2d  mber</i>.  -----
0790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07a0: 2d 2d 0a 20 20 3c 69 3e 2d 2d 20 20 20 31 20 7c  --.  <i>--   1 |
07b0: 20 61 61 61 20 7c 20 31 20 20 20 20 20 20 20 20   aaa | 1        
07c0: 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20   </i>.  <i>--   
07d0: 32 20 7c 20 63 63 63 20 7c 20 33 20 20 20 20 20  2 | ccc | 3     
07e0: 20 20 20 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d      </i>.  <i>--
07f0: 20 20 20 33 20 7c 20 62 62 62 20 7c 20 32 20 20     3 | bbb | 2  
0800: 20 20 20 20 20 20 20 3c 2f 69 3e 0a 20 20 3c 69         </i>.  <i
0810: 3e 2d 2d 20 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  >-- </i>.  SELEC
0820: 54 20 78 2c 20 79 2c 20 72 6f 77 5f 6e 75 6d 62  T x, y, row_numb
0830: 65 72 28 29 20 4f 56 45 52 20 28 4f 52 44 45 52  er() OVER (ORDER
0840: 20 42 59 20 79 29 20 41 53 20 72 6f 77 5f 6e 75   BY y) AS row_nu
0850: 6d 62 65 72 20 46 52 4f 4d 20 74 30 20 4f 52 44  mber FROM t0 ORD
0860: 45 52 20 42 59 20 78 3b 0a 3c 2f 63 6f 64 65 62  ER BY x;.</codeb
0870: 6c 6f 63 6b 3e 0a 0a 3c 70 3e 54 68 65 20 65 78  lock>..<p>The ex
0880: 61 6d 70 6c 65 20 61 62 6f 76 65 20 75 73 65 73  ample above uses
0890: 20 74 68 65 20 73 70 65 63 69 61 6c 20 62 75 69   the special bui
08a0: 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e  lt-in window fun
08b0: 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62 65 72  ction row_number
08c0: 28 29 2e 0a 54 68 69 73 20 66 75 6e 63 74 69 6f  ()..This functio
08d0: 6e 20 72 65 74 75 72 6e 73 20 61 20 6d 6f 6e 6f  n returns a mono
08e0: 74 6f 6e 69 63 61 6c 6c 79 20 69 6e 63 72 65 61  tonically increa
08f0: 73 69 6e 67 20 69 6e 74 65 67 65 72 20 61 73 73  sing integer ass
0900: 69 67 6e 65 64 20 74 6f 20 65 61 63 68 0a 72 6f  igned to each.ro
0910: 77 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 74 68  w in order of th
0920: 65 20 74 68 65 20 22 4f 52 44 45 52 20 42 59 22  e the "ORDER BY"
0930: 20 63 6c 61 75 73 65 20 77 69 74 68 69 6e 20 74   clause within t
0940: 68 65 0a 3c 69 3e 26 6c 74 3b 77 69 6e 64 6f 77  he.<i>&lt;window
0950: 2d 64 65 66 69 6e 69 74 69 6f 6e 26 67 74 3b 3c  -definition&gt;<
0960: 2f 69 3e 20 28 69 6e 20 74 68 69 73 20 63 61 73  /i> (in this cas
0970: 65 20 22 4f 52 44 45 52 20 42 59 20 79 22 29 2e  e "ORDER BY y").
0980: 20 4e 6f 74 65 20 74 68 61 74 20 0a 74 68 69 73   Note that .this
0990: 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74   does not affect
09a0: 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
09b0: 69 63 68 20 72 65 73 75 6c 74 73 20 61 72 65 20  ich results are 
09c0: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
09d0: 75 73 65 72 20 2d 0a 74 68 61 74 20 69 73 20 73  user -.that is s
09e0: 74 69 6c 6c 20 67 6f 76 65 72 6e 65 64 20 62 79  till governed by
09f0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
0a00: 61 75 73 65 20 61 74 74 61 63 68 65 64 20 74 6f  ause attached to
0a10: 20 74 68 65 20 53 45 4c 45 43 54 0a 73 74 61 74   the SELECT.stat
0a20: 65 6d 65 6e 74 20 28 69 6e 20 74 68 69 73 20 63  ement (in this c
0a30: 61 73 65 20 22 4f 52 44 45 52 20 42 59 20 78 22  ase "ORDER BY x"
0a40: 29 2e 0a 0a 3c 70 3e 4e 61 6d 65 64 20 3c 69 3e  )...<p>Named <i>
0a50: 26 6c 74 3b 77 69 6e 64 6f 77 2d 64 65 66 69 6e  &lt;window-defin
0a60: 69 74 69 6f 6e 73 26 67 74 3b 3c 2f 69 3e 20 6d  itions&gt;</i> m
0a70: 61 79 20 61 6c 73 6f 20 62 65 20 61 64 64 65 64  ay also be added
0a80: 20 74 6f 20 61 20 53 45 4c 45 43 54 20 0a 73 74   to a SELECT .st
0a90: 61 74 65 6d 65 6e 74 20 75 73 69 6e 67 20 61 20  atement using a 
0aa0: 57 49 4e 44 4f 57 20 63 6c 61 75 73 65 20 61 6e  WINDOW clause an
0ab0: 64 20 74 68 65 6e 20 72 65 66 65 72 65 64 20 74  d then refered t
0ac0: 6f 20 62 79 20 6e 61 6d 65 20 77 69 74 68 69 6e  o by name within
0ad0: 20 77 69 6e 64 6f 77 0a 66 75 6e 63 74 69 6f 6e   window.function
0ae0: 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 46 6f   invocations. Fo
0af0: 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 66  r example, the f
0b00: 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20  ollowing SELECT 
0b10: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69  statement contai
0b20: 6e 73 0a 74 77 6f 20 6e 61 6d 65 64 20 3c 69 3e  ns.two named <i>
0b30: 26 6c 74 3b 77 69 6e 64 6f 77 2d 64 65 66 69 6e  &lt;window-defin
0b40: 69 74 69 6f 6e 73 26 67 74 3b 3c 2f 69 3e 2c 20  itions&gt;</i>, 
0b50: 22 77 69 6e 31 22 20 61 6e 64 20 22 77 69 6e 32  "win1" and "win2
0b60: 22 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  ":..<codeblock>.
0b70: 20 20 53 45 4c 45 43 54 20 78 2c 20 79 2c 20 72    SELECT x, y, r
0b80: 6f 77 5f 6e 75 6d 62 65 72 28 29 20 4f 56 45 52  ow_number() OVER
0b90: 20 3c 62 3e 77 69 6e 31 3c 2f 62 3e 2c 20 72 61   <b>win1</b>, ra
0ba0: 6e 6b 28 29 20 4f 56 45 52 20 3c 62 3e 77 69 6e  nk() OVER <b>win
0bb0: 32 3c 2f 62 3e 20 46 52 4f 4d 20 74 30 20 0a 20  2</b> FROM t0 . 
0bc0: 20 57 49 4e 44 4f 57 20 3c 62 3e 77 69 6e 31 3c   WINDOW <b>win1<
0bd0: 2f 62 3e 20 41 53 20 28 4f 52 44 45 52 20 42 59  /b> AS (ORDER BY
0be0: 20 79 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e   y RANGE BETWEEN
0bf0: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
0c00: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
0c10: 20 52 4f 57 29 2c 0a 20 20 20 20 20 20 20 20 20   ROW),.         
0c20: 3c 62 3e 77 69 6e 32 3c 2f 62 3e 20 41 53 20 28  <b>win2</b> AS (
0c30: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 79 20 4f  PARTITION BY y O
0c40: 52 44 45 52 20 42 59 20 78 29 0a 20 20 4f 52 44  RDER BY x).  ORD
0c50: 45 52 20 42 59 20 78 3b 0a 3c 2f 63 6f 64 65 62  ER BY x;.</codeb
0c60: 6c 6f 63 6b 3e 0a 0a 3c 70 3e 54 68 65 20 57 49  lock>..<p>The WI
0c70: 4e 44 4f 57 20 63 6c 61 75 73 65 2c 20 77 68 65  NDOW clause, whe
0c80: 6e 20 6f 6e 65 20 69 73 20 70 72 65 73 65 6e 74  n one is present
0c90: 2c 20 63 6f 6d 65 73 20 61 66 74 65 72 20 61 6e  , comes after an
0ca0: 79 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  y HAVING clause 
0cb0: 61 6e 64 0a 62 65 66 6f 72 65 20 61 6e 79 20 4f  and.before any O
0cc0: 52 44 45 52 20 42 59 2e 0a 0a 3c 68 31 20 74 61  RDER BY...<h1 ta
0cd0: 67 73 3d 22 61 67 67 72 65 67 61 74 65 20 77 69  gs="aggregate wi
0ce0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 22 3e  ndow functions">
0cf0: 41 67 67 72 65 67 61 74 65 20 57 69 6e 64 6f 77  Aggregate Window
0d00: 20 46 75 6e 63 74 69 6f 6e 73 3c 2f 68 31 3e 0a   Functions</h1>.
0d10: 0a 3c 70 3e 20 54 68 65 20 65 78 61 6d 70 6c 65  .<p> The example
0d20: 73 20 69 6e 20 74 68 69 73 20 73 65 63 74 69 6f  s in this sectio
0d30: 6e 20 61 6c 6c 20 61 73 73 75 6d 65 20 74 68 61  n all assume tha
0d40: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  t the database i
0d50: 73 20 70 6f 70 75 6c 61 74 65 64 20 61 73 0a 66  s populated as.f
0d60: 6f 6c 6c 6f 77 73 3a 0a 0a 3c 63 6f 64 65 62 6c  ollows:..<codebl
0d70: 6f 63 6b 3e 0a 20 20 43 52 45 41 54 45 20 54 41  ock>.  CREATE TA
0d80: 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52  BLE t1(a INTEGER
0d90: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c   PRIMARY KEY, b,
0da0: 20 63 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   c);.  INSERT IN
0db0: 54 4f 20 74 31 20 56 41 4c 55 45 53 20 20 20 28  TO t1 VALUES   (
0dc0: 31 2c 20 27 41 27 2c 20 27 6f 6e 65 27 20 20 29  1, 'A', 'one'  )
0dd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 28 32 2c 20              (2, 
0df0: 27 42 27 2c 20 27 74 77 6f 27 20 20 29 2c 0a 20  'B', 'two'  ),. 
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e10: 20 20 20 20 20 20 20 20 20 28 33 2c 20 27 43 27           (3, 'C'
0e20: 2c 20 27 74 68 72 65 65 27 29 2c 0a 20 20 20 20  , 'three'),.    
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e40: 20 20 20 20 20 20 28 34 2c 20 27 44 27 2c 20 27        (4, 'D', '
0e50: 6f 6e 65 27 20 20 29 2c 0a 20 20 20 20 20 20 20  one'  ),.       
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e70: 20 20 20 28 35 2c 20 27 45 27 2c 20 27 74 77 6f     (5, 'E', 'two
0e80: 27 20 20 29 2c 0a 20 20 20 20 20 20 20 20 20 20  '  ),.          
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ea0: 28 36 2c 20 27 46 27 2c 20 27 74 68 72 65 65 27  (6, 'F', 'three'
0eb0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 37 2c               (7,
0ed0: 20 27 47 27 2c 20 27 6f 6e 65 27 20 20 29 3b 0a   'G', 'one'  );.
0ee0: 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70  </codeblock>..<p
0ef0: 3e 20 41 6e 20 61 67 67 72 65 67 61 74 65 20 77  > An aggregate w
0f00: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69  indow function i
0f10: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 61 6e 20  s similar to an 
0f20: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
0f30: 6f 6e 2c 20 65 78 63 65 70 74 0a 61 64 64 69 6e  on, except.addin
0f40: 67 20 69 74 20 74 6f 20 61 20 71 75 65 72 79 20  g it to a query 
0f50: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
0f60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
0f70: 77 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 73  ws returned. Ins
0f80: 74 65 61 64 2c 0a 66 6f 72 20 65 61 63 68 20 72  tead,.for each r
0f90: 6f 77 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ow the result of
0fa0: 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 77   the aggregate w
0fb0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69  indow function i
0fc0: 73 20 61 73 20 69 66 20 74 68 65 0a 63 6f 72 72  s as if the.corr
0fd0: 65 73 70 6f 6e 64 69 6e 67 20 61 67 67 72 65 67  esponding aggreg
0fe0: 61 74 65 20 77 65 72 65 20 72 75 6e 20 6f 76 65  ate were run ove
0ff0: 72 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74 68  r all rows in th
1000: 65 20 22 77 69 6e 64 6f 77 20 66 72 61 6d 65 22  e "window frame"
1010: 2e 0a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  ....<codeblock>.
1020: 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c    <i>-- The foll
1030: 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61  owing SELECT sta
1040: 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 3a 3c  tement returns:<
1050: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 3c 2f 69 3e  /i>.  <i>-- </i>
1060: 0a 20 20 3c 69 3e 2d 2d 20 20 20 61 20 7c 20 62  .  <i>--   a | b
1070: 20 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 3c   | group_concat<
1080: 2f 69 3e 0a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /i>.  ----------
1090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
10a0: 20 20 3c 69 3e 2d 2d 20 20 20 31 20 7c 20 41 20    <i>--   1 | A 
10b0: 7c 20 41 2e 42 20 20 20 20 20 20 20 20 20 3c 2f  | A.B         </
10c0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 32 20 7c  i>.  <i>--   2 |
10d0: 20 42 20 7c 20 41 2e 42 2e 43 20 20 20 20 20 20   B | A.B.C      
10e0: 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20   </i>.  <i>--   
10f0: 33 20 7c 20 43 20 7c 20 42 2e 43 2e 44 20 20 20  3 | C | B.C.D   
1100: 20 20 20 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d      </i>.  <i>--
1110: 20 20 20 34 20 7c 20 44 20 7c 20 43 2e 44 2e 45     4 | D | C.D.E
1120: 20 20 20 20 20 20 20 3c 2f 69 3e 0a 20 20 3c 69         </i>.  <i
1130: 3e 2d 2d 20 20 20 35 20 7c 20 45 20 7c 20 44 2e  >--   5 | E | D.
1140: 45 2e 46 20 20 20 20 20 20 20 3c 2f 69 3e 0a 20  E.F       </i>. 
1150: 20 3c 69 3e 2d 2d 20 20 20 36 20 7c 20 46 20 7c   <i>--   6 | F |
1160: 20 45 2e 46 2e 47 20 20 20 20 20 20 20 3c 2f 69   E.F.G       </i
1170: 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 37 20 7c 20  >.  <i>--   7 | 
1180: 47 20 7c 20 46 2e 47 20 20 20 20 20 20 20 20 20  G | F.G         
1190: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 3c 2f 69  </i>.  <i>-- </i
11a0: 3e 0a 20 20 53 45 4c 45 43 54 20 61 2c 20 62 2c  >.  SELECT a, b,
11b0: 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 62 2c   group_concat(b,
11c0: 20 27 2e 27 29 20 4f 56 45 52 20 28 0a 20 20 20   '.') OVER (.   
11d0: 20 4f 52 44 45 52 20 42 59 20 61 20 52 4f 57 53   ORDER BY a ROWS
11e0: 20 42 45 54 57 45 45 4e 20 31 20 50 52 45 43 45   BETWEEN 1 PRECE
11f0: 44 49 4e 47 20 41 4e 44 20 31 20 46 4f 4c 4c 4f  DING AND 1 FOLLO
1200: 57 49 4e 47 0a 20 20 29 20 41 53 20 67 72 6f 75  WING.  ) AS grou
1210: 70 5f 63 6f 6e 63 61 74 20 46 52 4f 4d 20 74 31  p_concat FROM t1
1220: 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  ;.</codeblock>..
1230: 3c 70 3e 20 49 6e 20 74 68 65 20 65 78 61 6d 70  <p> In the examp
1240: 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 77 69  le above, the wi
1250: 6e 64 6f 77 20 66 72 61 6d 65 20 63 6f 6e 73 69  ndow frame consi
1260: 73 74 73 20 6f 66 20 61 6c 6c 20 72 6f 77 73 20  sts of all rows 
1270: 62 65 74 77 65 65 6e 20 74 68 65 0a 70 72 65 76  between the.prev
1280: 69 6f 75 73 20 72 6f 77 20 28 22 31 20 50 52 45  ious row ("1 PRE
1290: 43 45 44 49 4e 47 22 29 20 61 6e 64 20 74 68 65  CEDING") and the
12a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 77 20 28   following row (
12b0: 22 31 20 46 4f 4c 4c 4f 57 49 4e 47 22 29 2c 20  "1 FOLLOWING"), 
12c0: 69 6e 63 6c 75 73 69 76 65 2c 0a 77 68 65 72 65  inclusive,.where
12d0: 20 72 6f 77 73 20 61 72 65 20 73 6f 72 74 65 64   rows are sorted
12e0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
12f0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1300: 65 20 69 6e 20 74 68 65 0a 3c 69 3e 26 6c 74 3b  e in the.<i>&lt;
1310: 77 69 6e 64 6f 77 2d 64 65 66 69 6e 69 74 69 6f  window-definitio
1320: 6e 26 67 74 3b 3c 2f 69 3e 20 28 69 6e 20 74 68  n&gt;</i> (in th
1330: 69 73 20 63 61 73 65 20 22 4f 52 44 45 52 20 42  is case "ORDER B
1340: 59 20 61 22 29 2e 20 46 6f 72 20 65 78 61 6d 70  Y a"). For examp
1350: 6c 65 2c 20 74 68 65 20 66 72 61 6d 65 20 66 6f  le, the frame fo
1360: 72 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 28  r the row with (
1370: 61 3d 33 29 20 63 6f 6e 73 69 73 74 73 20 6f 66  a=3) consists of
1380: 20 72 6f 77 73 20 28 32 2c 20 27 42 27 2c 20 27   rows (2, 'B', '
1390: 74 77 6f 27 29 2c 20 28 33 2c 20 27 43 27 2c 20  two'), (3, 'C', 
13a0: 27 74 68 72 65 65 27 29 20 61 6e 64 20 28 34 2c  'three') and (4,
13b0: 20 27 44 27 2c 20 27 6f 6e 65 27 29 2e 20 54 68   'D', 'one'). Th
13c0: 65 20 72 65 73 75 6c 74 20 6f 66 20 67 72 6f 75  e result of grou
13d0: 70 5f 63 6f 6e 63 61 74 28 62 2c 20 27 2e 27 29  p_concat(b, '.')
13e0: 20 66 6f 72 20 74 68 61 74 20 72 6f 77 20 69 73   for that row is
13f0: 20 74 68 65 72 65 66 6f 72 65 20 27 42 2e 43 2e   therefore 'B.C.
1400: 44 27 2e 0a 0a 3c 70 3e 20 54 68 65 20 64 65 66  D'...<p> The def
1410: 61 75 6c 74 20 3c 69 3e 26 6c 74 3b 66 72 61 6d  ault <i>&lt;fram
1420: 65 2d 73 70 65 63 69 66 69 63 61 74 69 6f 6e 26  e-specification&
1430: 67 74 3b 3c 2f 69 3e 20 69 73 3a 0a 0a 3c 63 6f  gt;</i> is:..<co
1440: 64 65 62 6c 6f 63 6b 3e 0a 20 20 20 20 52 41 4e  deblock>.    RAN
1450: 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  GE BETWEEN UNBOU
1460: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
1470: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 3c  ND CURRENT ROW.<
1480: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
1490: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
14a0: 2c 20 61 66 74 65 72 20 73 6f 72 74 69 6e 67 20  , after sorting 
14b0: 74 68 65 20 72 6f 77 73 20 72 65 74 75 72 6e 65  the rows returne
14c0: 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
14d0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 74 68 65  according to.the
14e0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
14f0: 20 69 6e 20 74 68 65 20 26 6c 74 3b 77 69 6e 64   in the &lt;wind
1500: 6f 77 2d 64 65 66 69 6e 69 74 69 6f 6e 26 67 74  ow-definition&gt
1510: 3b 2c 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72  ;, the window fr
1520: 61 6d 65 20 63 6f 6e 73 69 73 74 73 0a 6f 66 20  ame consists.of 
1530: 61 6c 6c 20 72 6f 77 73 20 62 65 74 77 65 65 6e  all rows between
1540: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 61   the first row a
1550: 6e 64 20 74 68 65 20 6c 61 73 74 20 72 6f 77 20  nd the last row 
1560: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 76 61  with the same va
1570: 6c 75 65 73 20 61 73 20 74 68 65 20 63 75 72 72  lues as the curr
1580: 65 6e 74 20 72 6f 77 20 66 6f 72 20 61 6c 6c 20  ent row for all 
1590: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
15a0: 69 6f 6e 73 2e 20 54 68 69 73 20 69 6d 70 6c 69  ions. This impli
15b0: 65 73 20 74 68 61 74 20 72 6f 77 73 20 74 68 61  es that rows tha
15c0: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
15d0: 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 4f  values for all O
15e0: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
15f0: 6f 6e 73 20 77 69 6c 6c 20 61 6c 73 6f 20 68 61  ons will also ha
1600: 76 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  ve the same valu
1610: 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  e for the result
1620: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1630: 75 6e 63 74 69 6f 6e 20 28 61 73 20 74 68 65 20  unction (as the 
1640: 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20  window frame is 
1650: 74 68 65 20 73 61 6d 65 29 2e 20 46 6f 72 20 65  the same). For e
1660: 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c  xample:..<codebl
1670: 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 65  ock>.  <i>-- The
1680: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
1690: 54 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75  T statement retu
16a0: 72 6e 73 3a 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  rns:</i>.  <i>--
16b0: 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20   </i>.  <i>--   
16c0: 61 20 7c 20 62 20 7c 20 63 20 7c 20 67 72 6f 75  a | b | c | grou
16d0: 70 5f 63 6f 6e 63 61 74 3c 2f 69 3e 0a 20 20 2d  p_concat</i>.  -
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 3c  ------------.  <
1700: 69 3e 2d 2d 20 20 20 31 20 7c 20 41 20 7c 20 6f  i>--   1 | A | o
1710: 6e 65 20 20 20 7c 20 41 2e 44 2e 47 20 20 20 20  ne   | A.D.G    
1720: 20 20 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20     </i>.  <i>-- 
1730: 20 20 32 20 7c 20 42 20 7c 20 74 77 6f 20 20 20    2 | B | two   
1740: 7c 20 41 2e 44 2e 47 2e 43 2e 46 2e 42 2e 45 3c  | A.D.G.C.F.B.E<
1750: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 33 20  /i>.  <i>--   3 
1760: 7c 20 43 20 7c 20 74 68 72 65 65 20 7c 20 41 2e  | C | three | A.
1770: 44 2e 47 2e 43 2e 46 20 20 20 3c 2f 69 3e 0a 20  D.G.C.F   </i>. 
1780: 20 3c 69 3e 2d 2d 20 20 20 34 20 7c 20 44 20 7c   <i>--   4 | D |
1790: 20 6f 6e 65 20 20 20 7c 20 41 2e 44 2e 47 20 20   one   | A.D.G  
17a0: 20 20 20 20 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d       </i>.  <i>-
17b0: 2d 20 20 20 35 20 7c 20 45 20 7c 20 74 77 6f 20  -   5 | E | two 
17c0: 20 20 7c 20 41 2e 44 2e 47 2e 43 2e 46 2e 42 2e    | A.D.G.C.F.B.
17d0: 45 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20  E</i>.  <i>--   
17e0: 36 20 7c 20 46 20 7c 20 74 68 72 65 65 20 7c 20  6 | F | three | 
17f0: 41 2e 44 2e 47 2e 43 2e 46 20 20 20 3c 2f 69 3e  A.D.G.C.F   </i>
1800: 0a 20 20 3c 69 3e 2d 2d 20 20 20 37 20 7c 20 47  .  <i>--   7 | G
1810: 20 7c 20 6f 6e 65 20 20 20 7c 20 41 2e 44 2e 47   | one   | A.D.G
1820: 20 20 20 20 20 20 20 3c 2f 69 3e 0a 20 20 3c 69         </i>.  <i
1830: 3e 2d 2d 20 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  >-- </i>.  SELEC
1840: 54 20 61 2c 20 62 2c 20 63 2c 20 0a 20 20 20 20  T a, b, c, .    
1850: 20 20 20 20 20 67 72 6f 75 70 5f 63 6f 6e 63 61       group_conca
1860: 74 28 62 2c 20 27 2e 27 29 20 4f 56 45 52 20 28  t(b, '.') OVER (
1870: 4f 52 44 45 52 20 42 59 20 63 29 20 41 53 20 67  ORDER BY c) AS g
1880: 72 6f 75 70 5f 63 6f 6e 63 61 74 20 0a 20 20 46  roup_concat .  F
1890: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
18a0: 61 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  a;.</codeblock>.
18b0: 0a 3c 70 3e 20 41 6c 6c 20 6f 66 20 53 51 4c 69  .<p> All of SQLi
18c0: 74 65 27 73 20 5b 41 67 67 72 65 67 61 74 65 20  te's [Aggregate 
18d0: 46 75 6e 63 74 69 6f 6e 73 7c 61 67 67 72 65 67  Functions|aggreg
18e0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 5d 20 6d  ate functions] m
18f0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 61 67  ay be used as ag
1900: 67 72 65 67 61 74 65 20 77 69 6e 64 6f 77 0a 66  gregate window.f
1910: 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20  unctions. It is 
1920: 61 6c 73 6f 20 70 6f 73 73 69 62 6c 65 20 74 6f  also possible to
1930: 20 0a 5b 75 73 65 72 2d 64 65 66 69 6e 65 64 20   .[user-defined 
1940: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
1950: 7c 63 72 65 61 74 65 20 75 73 65 72 2d 64 65 66  |create user-def
1960: 69 6e 65 64 20 61 67 67 72 65 67 61 74 65 20 77  ined aggregate w
1970: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 5d  indow functions]
1980: 2e 0a 0a 3c 68 32 3e 46 72 61 6d 65 20 53 70 65  ...<h2>Frame Spe
1990: 63 69 66 69 63 61 74 69 6f 6e 73 3c 2f 68 32 3e  cifications</h2>
19a0: 0a 0a 3c 70 3e 20 41 20 77 69 6e 64 6f 77 20 66  ..<p> A window f
19b0: 72 61 6d 65 20 73 70 65 63 69 66 69 63 61 74 69  rame specificati
19c0: 6f 6e 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  on consists of t
19d0: 68 72 65 65 20 74 68 69 6e 67 73 3a 0a 0a 3c 75  hree things:..<u
19e0: 6c 3e 0a 20 20 3c 6c 69 3e 20 41 20 66 72 61 6d  l>.  <li> A fram
19f0: 65 20 74 79 70 65 20 2d 20 65 69 74 68 65 72 20  e type - either 
1a00: 52 41 4e 47 45 20 6f 72 20 52 4f 57 53 2e 0a 20  RANGE or ROWS.. 
1a10: 20 3c 6c 69 3e 20 41 20 73 74 61 72 74 69 6e 67   <li> A starting
1a20: 20 66 72 61 6d 65 20 62 6f 75 6e 64 61 72 79 2c   frame boundary,
1a30: 20 61 6e 64 0a 20 20 3c 6c 69 3e 20 41 6e 20 65   and.  <li> An e
1a40: 6e 64 69 6e 67 20 66 72 61 6d 65 20 62 6f 75 6e  nding frame boun
1a50: 64 61 72 79 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e  dary..</ul>..<p>
1a60: 20 49 66 20 74 68 65 20 66 72 61 6d 65 20 74 79   If the frame ty
1a70: 70 65 20 69 73 20 52 41 4e 47 45 2c 20 74 68 65  pe is RANGE, the
1a80: 6e 20 72 6f 77 73 20 77 69 74 68 20 74 68 65 20  n rows with the 
1a90: 73 61 6d 65 20 76 61 6c 75 65 73 20 66 6f 72 20  same values for 
1aa0: 61 6c 6c 20 4f 52 44 45 52 20 42 59 0a 65 78 70  all ORDER BY.exp
1ab0: 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6e  ressions are con
1ac0: 73 69 64 65 72 65 64 20 22 70 65 65 72 73 22 2e  sidered "peers".
1ad0: 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20 61 72   Or, if there ar
1ae0: 65 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 65 78  e no ORDER BY ex
1af0: 70 72 65 73 73 69 6f 6e 73 2c 0a 61 6c 6c 20 72  pressions,.all r
1b00: 6f 77 73 20 61 72 65 20 70 65 65 72 73 2e 20 52  ows are peers. R
1b10: 6f 77 73 20 74 68 61 74 20 61 72 65 20 70 65 65  ows that are pee
1b20: 72 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 74  rs always have t
1b30: 68 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 66  he same window f
1b40: 72 61 6d 65 73 2e 0a 0a 3c 70 3e 20 54 68 65 72  rames...<p> Ther
1b50: 65 20 61 72 65 20 66 69 76 65 20 6f 70 74 69 6f  e are five optio
1b60: 6e 73 20 66 6f 72 20 66 72 61 6d 65 20 62 6f 75  ns for frame bou
1b70: 6e 64 61 72 69 65 73 3a 0a 0a 3c 74 61 62 6c 65  ndaries:..<table
1b80: 20 73 74 72 69 70 65 64 3d 31 3e 0a 3c 74 72 3e   striped=1>.<tr>
1b90: 3c 74 68 3e 46 72 61 6d 65 20 42 6f 75 6e 64 61  <th>Frame Bounda
1ba0: 72 79 20 3c 74 68 3e 44 65 73 63 72 69 70 74 69  ry <th>Descripti
1bb0: 6f 6e 0a 3c 74 72 3e 3c 74 64 3e 55 4e 42 4f 55  on.<tr><td>UNBOU
1bc0: 4e 44 45 44 26 6e 62 73 70 3b 50 52 45 43 45 44  NDED&nbsp;PRECED
1bd0: 49 4e 47 20 3c 74 64 3e 20 54 68 69 73 20 6d 61  ING <td> This ma
1be0: 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 61  y only be used a
1bf0: 73 20 61 20 73 74 61 72 74 69 6e 67 20 66 72 61  s a starting fra
1c00: 6d 65 0a 20 20 20 20 20 20 20 20 62 6f 75 6e 64  me.        bound
1c10: 61 72 79 2e 20 49 6e 20 77 68 69 63 68 20 63 61  ary. In which ca
1c20: 73 65 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  se the start of 
1c30: 74 68 65 20 66 72 61 6d 65 20 69 73 20 61 6c 77  the frame is alw
1c40: 61 79 73 20 74 68 65 20 66 69 72 73 74 0a 20 20  ays the first.  
1c50: 20 20 20 20 20 20 72 6f 77 20 69 6e 20 74 68 65        row in the
1c60: 20 73 65 74 2e 0a 3c 74 72 3e 3c 74 64 3e 26 6c   set..<tr><td>&l
1c70: 74 3b 65 78 70 72 26 67 74 3b 20 50 52 45 43 45  t;expr&gt; PRECE
1c80: 44 49 4e 47 20 3c 74 64 3e 20 26 6c 74 3b 65 78  DING <td> &lt;ex
1c90: 70 72 26 67 74 3b 2c 20 77 68 69 63 68 20 6d 61  pr&gt;, which ma
1ca0: 79 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61  y not refer to a
1cb0: 6e 79 0a 20 20 20 20 20 20 20 20 74 61 62 6c 65  ny.        table
1cc0: 20 63 6f 6c 75 6d 6e 73 2c 20 6d 75 73 74 20 65   columns, must e
1cd0: 76 61 6c 75 61 74 65 20 74 6f 20 61 20 6e 6f 6e  valuate to a non
1ce0: 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65  -negative intege
1cf0: 72 20 76 61 6c 75 65 2e 20 54 68 65 20 73 74 61  r value. The sta
1d00: 72 74 0a 20 20 20 20 20 20 20 20 6f 72 20 65 6e  rt.        or en
1d10: 64 20 6f 66 20 74 68 65 20 66 72 61 6d 65 20 69  d of the frame i
1d20: 73 20 26 6c 74 3b 65 78 70 72 26 67 74 3b 20 72  s &lt;expr&gt; r
1d30: 6f 77 73 20 62 65 66 6f 72 65 20 74 68 65 20 63  ows before the c
1d40: 75 72 72 65 6e 74 20 72 6f 77 2e 20 22 30 0a 20  urrent row. "0. 
1d50: 20 20 20 20 20 20 20 50 52 45 43 45 44 49 4e 47         PRECEDING
1d60: 22 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  " is the same as
1d70: 20 22 43 55 52 52 45 4e 54 20 52 4f 57 22 2e 20   "CURRENT ROW". 
1d80: 54 68 69 73 20 66 72 61 6d 65 20 62 6f 75 6e 64  This frame bound
1d90: 61 72 79 20 74 79 70 65 20 6d 61 79 0a 20 20 20  ary type may.   
1da0: 20 20 20 20 20 6f 6e 6c 79 20 62 65 20 75 73 65       only be use
1db0: 64 20 77 69 74 68 20 52 4f 57 53 20 66 72 61 6d  d with ROWS fram
1dc0: 65 73 2e 0a 3c 74 72 3e 3c 74 64 3e 43 55 52 52  es..<tr><td>CURR
1dd0: 45 4e 54 20 52 4f 57 20 3c 74 64 3e 20 54 68 65  ENT ROW <td> The
1de0: 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 46 6f   current row. Fo
1df0: 72 20 52 41 4e 47 45 20 66 72 61 6d 65 20 74 79  r RANGE frame ty
1e00: 70 65 73 2c 20 61 6c 6c 20 70 65 65 72 73 20 6f  pes, all peers o
1e10: 66 0a 20 20 20 20 20 20 20 20 74 68 65 20 63 75  f.        the cu
1e20: 72 72 65 6e 74 20 72 6f 77 20 61 72 65 20 61 6c  rrent row are al
1e30: 73 6f 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  so included in t
1e40: 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 2c  he window frame,
1e50: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 20   regardless of. 
1e60: 20 20 20 20 20 20 20 77 68 65 74 68 65 72 20 43         whether C
1e70: 55 52 52 45 4e 54 20 52 4f 57 20 69 73 20 75 73  URRENT ROW is us
1e80: 65 64 20 61 73 20 74 68 65 20 73 74 61 72 74 69  ed as the starti
1e90: 6e 67 20 6f 72 20 65 6e 64 69 6e 67 20 66 72 61  ng or ending fra
1ea0: 6d 65 20 62 6f 75 6e 64 61 72 79 2e 0a 3c 74 72  me boundary..<tr
1eb0: 3e 3c 74 64 3e 26 6c 74 3b 65 78 70 72 26 67 74  ><td>&lt;expr&gt
1ec0: 3b 20 46 4f 4c 4c 4f 57 49 4e 47 20 3c 74 64 3e  ; FOLLOWING <td>
1ed0: 20 26 6c 74 3b 65 78 70 72 26 67 74 3b 2c 20 77   &lt;expr&gt;, w
1ee0: 68 69 63 68 20 6d 61 79 20 6e 6f 74 20 72 65 66  hich may not ref
1ef0: 65 72 20 74 6f 20 61 6e 79 0a 20 20 20 20 20 20  er to any.      
1f00: 20 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2c    table columns,
1f10: 20 6d 75 73 74 20 65 76 61 6c 75 61 74 65 20 74   must evaluate t
1f20: 6f 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  o a non-negative
1f30: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20   integer value. 
1f40: 54 68 65 20 73 74 61 72 74 0a 20 20 20 20 20 20  The start.      
1f50: 20 20 6f 72 20 65 6e 64 20 6f 66 20 74 68 65 20    or end of the 
1f60: 66 72 61 6d 65 20 69 73 20 26 6c 74 3b 65 78 70  frame is &lt;exp
1f70: 72 26 67 74 3b 20 72 6f 77 73 20 61 66 74 65 72  r&gt; rows after
1f80: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1f90: 2e 20 22 30 0a 20 20 20 20 20 20 20 20 46 4f 4c  . "0.        FOL
1fa0: 4c 4f 57 49 4e 47 22 20 69 73 20 74 68 65 20 73  LOWING" is the s
1fb0: 61 6d 65 20 61 73 20 22 43 55 52 52 45 4e 54 20  ame as "CURRENT 
1fc0: 52 4f 57 22 2e 20 54 68 69 73 20 66 72 61 6d 65  ROW". This frame
1fd0: 20 62 6f 75 6e 64 61 72 79 20 74 79 70 65 20 6d   boundary type m
1fe0: 61 79 0a 20 20 20 20 20 20 20 20 6f 6e 6c 79 20  ay.        only 
1ff0: 62 65 20 75 73 65 64 20 77 69 74 68 20 52 4f 57  be used with ROW
2000: 53 20 66 72 61 6d 65 73 2e 0a 3c 74 72 3e 3c 74  S frames..<tr><t
2010: 64 3e 55 4e 42 4f 55 4e 44 45 44 26 6e 62 73 70  d>UNBOUNDED&nbsp
2020: 3b 46 4f 4c 4c 4f 57 49 4e 47 20 3c 74 64 3e 20  ;FOLLOWING <td> 
2030: 54 68 69 73 20 6d 61 79 20 6f 6e 6c 79 20 62 65  This may only be
2040: 20 75 73 65 64 20 61 73 20 61 6e 20 65 6e 64 69   used as an endi
2050: 6e 67 0a 20 20 20 20 20 20 20 20 66 72 61 6d 65  ng.        frame
2060: 20 62 6f 75 6e 64 61 72 79 2e 20 49 6e 20 77 68   boundary. In wh
2070: 69 63 68 20 63 61 73 65 20 74 68 65 20 65 6e 64  ich case the end
2080: 20 6f 66 20 74 68 65 20 66 72 61 6d 65 20 69 73   of the frame is
2090: 20 61 6c 77 61 79 73 20 74 68 65 20 6c 61 73 74   always the last
20a0: 0a 20 20 20 20 20 20 20 20 72 6f 77 20 69 6e 20  .        row in 
20b0: 74 68 65 20 73 65 74 2e 0a 3c 2f 74 61 62 6c 65  the set..</table
20c0: 3e 0a 0a 3c 70 3e 20 54 68 65 20 65 6e 64 69 6e  >..<p> The endin
20d0: 67 20 66 72 61 6d 65 20 62 6f 75 6e 64 61 72 79  g frame boundary
20e0: 20 6d 75 73 74 20 6e 6f 74 20 74 61 6b 65 20 61   must not take a
20f0: 20 66 6f 72 6d 20 74 68 61 74 20 61 70 70 65 61   form that appea
2100: 72 73 20 68 69 67 68 65 72 20 69 6e 0a 74 68 65  rs higher in.the
2110: 20 61 62 6f 76 65 20 6c 69 73 74 20 74 68 61 6e   above list than
2120: 20 74 68 65 20 73 74 61 72 74 69 6e 67 20 66 72   the starting fr
2130: 61 6d 65 20 62 6f 75 6e 64 61 72 79 2e 0a 0a 3c  ame boundary...<
2140: 70 3e 20 49 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  p> In the follow
2150: 69 6e 67 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  ing example, the
2160: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 66 6f   window frame fo
2170: 72 20 65 61 63 68 20 72 6f 77 20 63 6f 6e 73 69  r each row consi
2180: 73 74 73 20 6f 66 20 61 6c 6c 0a 72 6f 77 73 20  sts of all.rows 
2190: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
21a0: 20 72 6f 77 20 74 6f 20 74 68 65 20 65 6e 64 20   row to the end 
21b0: 6f 66 20 74 68 65 20 73 65 74 2c 20 77 68 65 72  of the set, wher
21c0: 65 20 72 6f 77 73 20 61 72 65 20 73 6f 72 74 65  e rows are sorte
21d0: 64 0a 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 22  d.according to "
21e0: 4f 52 44 45 52 20 42 59 20 61 22 2e 0a 0a 3c 63  ORDER BY a"...<c
21f0: 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d  odeblock>.  <i>-
2200: 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  - The following 
2210: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2220: 20 72 65 74 75 72 6e 73 3a 3c 2f 69 3e 0a 20 20   returns:</i>.  
2230: 3c 69 3e 2d 2d 20 3c 2f 69 3e 0a 20 20 3c 69 3e  <i>-- </i>.  <i>
2240: 2d 2d 20 20 20 63 20 20 20 20 20 7c 20 61 20 7c  --   c     | a |
2250: 20 62 20 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61   b | group_conca
2260: 74 3c 2f 69 3e 0a 20 20 2d 2d 2d 2d 2d 2d 2d 2d  t</i>.  --------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 3c 69 3e 2d  ---------.  <i>-
2290: 2d 20 20 20 6f 6e 65 20 20 20 7c 20 31 20 7c 20  -   one   | 1 | 
22a0: 41 20 7c 20 41 2e 44 2e 47 2e 43 2e 46 2e 42 2e  A | A.D.G.C.F.B.
22b0: 45 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20  E</i>.  <i>--   
22c0: 6f 6e 65 20 20 20 7c 20 34 20 7c 20 44 20 7c 20  one   | 4 | D | 
22d0: 44 2e 47 2e 43 2e 46 2e 42 2e 45 20 3c 2f 69 3e  D.G.C.F.B.E </i>
22e0: 0a 20 20 3c 69 3e 2d 2d 20 20 20 6f 6e 65 20 20  .  <i>--   one  
22f0: 20 7c 20 37 20 7c 20 47 20 7c 20 47 2e 43 2e 46   | 7 | G | G.C.F
2300: 2e 42 2e 45 20 20 20 3c 2f 69 3e 0a 20 20 3c 69  .B.E   </i>.  <i
2310: 3e 2d 2d 20 20 20 74 68 72 65 65 20 7c 20 33 20  >--   three | 3 
2320: 7c 20 43 20 7c 20 43 2e 46 2e 42 2e 45 20 20 20  | C | C.F.B.E   
2330: 20 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20    </i>.  <i>--  
2340: 20 74 68 72 65 65 20 7c 20 36 20 7c 20 46 20 7c   three | 6 | F |
2350: 20 46 2e 42 2e 45 20 20 20 20 20 20 20 3c 2f 69   F.B.E       </i
2360: 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 74 77 6f 20  >.  <i>--   two 
2370: 20 20 7c 20 32 20 7c 20 42 20 7c 20 42 2e 45 20    | 2 | B | B.E 
2380: 20 20 20 20 20 20 20 20 3c 2f 69 3e 0a 20 20 3c          </i>.  <
2390: 69 3e 2d 2d 20 20 20 74 77 6f 20 20 20 7c 20 35  i>--   two   | 5
23a0: 20 7c 20 45 20 7c 20 45 20 20 20 20 20 20 20 20   | E | E        
23b0: 20 20 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20     </i>.  <i>-- 
23c0: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 63 2c  </i>.  SELECT c,
23d0: 20 61 2c 20 62 2c 20 67 72 6f 75 70 5f 63 6f 6e   a, b, group_con
23e0: 63 61 74 28 62 2c 20 27 2e 27 29 20 4f 56 45 52  cat(b, '.') OVER
23f0: 20 28 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20   (.    ORDER BY 
2400: 63 2c 20 61 20 52 4f 57 53 20 42 45 54 57 45 45  c, a ROWS BETWEE
2410: 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  N CURRENT ROW AN
2420: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
2430: 4f 57 49 4e 47 0a 20 20 29 20 41 53 20 67 72 6f  OWING.  ) AS gro
2440: 75 70 5f 63 6f 6e 63 61 74 0a 20 20 46 52 4f 4d  up_concat.  FROM
2450: 20 74 31 20 4f 52 44 45 52 20 42 59 20 63 2c 20   t1 ORDER BY c, 
2460: 61 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  a;.</codeblock>.
2470: 0a 3c 68 32 3e 54 68 65 20 50 41 52 54 49 54 49  .<h2>The PARTITI
2480: 4f 4e 20 42 59 20 43 6c 61 75 73 65 3c 2f 68 32  ON BY Clause</h2
2490: 3e 0a 0a 3c 70 3e 20 41 20 3c 69 3e 26 6c 74 3b  >..<p> A <i>&lt;
24a0: 77 69 6e 64 6f 77 2d 64 65 66 69 6e 69 74 69 6f  window-definitio
24b0: 6e 26 67 74 3b 3c 2f 69 3e 20 6d 61 79 20 61 6c  n&gt;</i> may al
24c0: 73 6f 20 69 6e 63 6c 75 64 65 20 61 20 50 41 52  so include a PAR
24d0: 54 49 54 49 4f 4e 20 42 59 20 63 6c 61 75 73 65  TITION BY clause
24e0: 2e 0a 49 66 20 73 6f 2c 20 74 68 65 20 72 6f 77  ..If so, the row
24f0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
2500: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
2510: 6e 74 20 61 72 65 20 64 69 76 69 64 65 64 20 69  nt are divided i
2520: 6e 74 6f 20 67 72 6f 75 70 73 20 2d 0a 70 61 72  nto groups -.par
2530: 74 69 74 69 6f 6e 73 20 2d 20 77 69 74 68 20 74  titions - with t
2540: 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20 66  he same values f
2550: 6f 72 20 65 61 63 68 20 50 41 52 54 49 54 49 4f  or each PARTITIO
2560: 4e 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c  N BY expression,
2570: 20 61 6e 64 20 74 68 65 6e 0a 77 69 6e 64 6f 77   and then.window
2580: 2d 66 75 6e 63 74 69 6f 6e 20 70 72 6f 63 65 73  -function proces
2590: 73 69 6e 67 20 70 65 72 66 6f 72 6d 65 64 20 61  sing performed a
25a0: 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
25b0: 65 20 73 65 70 61 72 61 74 65 6c 79 20 66 6f 72  e separately for
25c0: 20 65 61 63 68 0a 70 61 72 74 69 74 69 6f 6e 2e   each.partition.
25d0: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
25e0: 20 74 6f 20 74 68 65 20 77 61 79 20 74 68 65 20   to the way the 
25f0: 72 6f 77 73 20 74 72 61 76 65 72 73 65 64 20 62  rows traversed b
2600: 79 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  y an aggregate q
2610: 75 65 72 79 0a 61 72 65 20 64 69 76 69 64 65 64  uery.are divided
2620: 20 69 6e 74 6f 20 67 72 6f 75 70 73 20 62 65 66   into groups bef
2630: 6f 72 65 20 61 6e 79 20 61 67 67 72 65 67 61 74  ore any aggregat
2640: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  e processing is 
2650: 70 65 72 66 6f 72 6d 65 64 2e 0a 0a 3c 70 3e 20  performed...<p> 
2660: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63  For example:..<c
2670: 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d  odeblock>.  <i>-
2680: 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  - The following 
2690: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
26a0: 20 72 65 74 75 72 6e 73 3a 3c 2f 69 3e 0a 20 20   returns:</i>.  
26b0: 3c 69 3e 2d 2d 20 3c 2f 69 3e 0a 20 20 3c 69 3e  <i>-- </i>.  <i>
26c0: 2d 2d 20 20 20 63 20 20 20 20 20 7c 20 61 20 7c  --   c     | a |
26d0: 20 62 20 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61   b | group_conca
26e0: 74 3c 2f 69 3e 0a 20 20 2d 2d 2d 2d 2d 2d 2d 2d  t</i>.  --------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 3c 69 3e 2d  ---------.  <i>-
2710: 2d 20 20 20 6f 6e 65 20 20 20 7c 20 31 20 7c 20  -   one   | 1 | 
2720: 41 20 7c 20 41 2e 44 2e 47 20 20 20 20 20 20 20  A | A.D.G       
2730: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 6f  </i>.  <i>--   o
2740: 6e 65 20 20 20 7c 20 34 20 7c 20 44 20 7c 20 44  ne   | 4 | D | D
2750: 2e 47 20 20 20 20 20 20 20 20 20 3c 2f 69 3e 0a  .G         </i>.
2760: 20 20 3c 69 3e 2d 2d 20 20 20 6f 6e 65 20 20 20    <i>--   one   
2770: 7c 20 37 20 7c 20 47 20 7c 20 47 20 20 20 20 20  | 7 | G | G     
2780: 20 20 20 20 20 20 3c 2f 69 3e 0a 20 20 3c 69 3e        </i>.  <i>
2790: 2d 2d 20 20 20 74 68 72 65 65 20 7c 20 33 20 7c  --   three | 3 |
27a0: 20 43 20 7c 20 43 2e 46 20 20 20 20 20 20 20 20   C | C.F        
27b0: 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20   </i>.  <i>--   
27c0: 74 68 72 65 65 20 7c 20 36 20 7c 20 46 20 7c 20  three | 6 | F | 
27d0: 46 20 20 20 20 20 20 20 20 20 20 20 3c 2f 69 3e  F           </i>
27e0: 0a 20 20 3c 69 3e 2d 2d 20 20 20 74 77 6f 20 20  .  <i>--   two  
27f0: 20 7c 20 32 20 7c 20 42 20 7c 20 42 2e 45 20 20   | 2 | B | B.E  
2800: 20 20 20 20 20 20 20 3c 2f 69 3e 0a 20 20 3c 69         </i>.  <i
2810: 3e 2d 2d 20 20 20 74 77 6f 20 20 20 7c 20 35 20  >--   two   | 5 
2820: 7c 20 45 20 7c 20 45 20 20 20 20 20 20 20 20 20  | E | E         
2830: 20 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 3c    </i>.  <i>-- <
2840: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 63 2c 20  /i>.  SELECT c, 
2850: 61 2c 20 62 2c 20 67 72 6f 75 70 5f 63 6f 6e 63  a, b, group_conc
2860: 61 74 28 62 2c 20 27 2e 27 29 20 4f 56 45 52 20  at(b, '.') OVER 
2870: 28 0a 20 20 20 20 50 41 52 54 49 54 49 4f 4e 20  (.    PARTITION 
2880: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 61 20  BY c ORDER BY a 
2890: 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55  RANGE BETWEEN CU
28a0: 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e  RRENT ROW AND UN
28b0: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
28c0: 47 0a 20 20 29 20 41 53 20 67 72 6f 75 70 5f 63  G.  ) AS group_c
28d0: 6f 6e 63 61 74 0a 20 20 46 52 4f 4d 20 74 31 20  oncat.  FROM t1 
28e0: 4f 52 44 45 52 20 42 59 20 63 2c 20 61 3b 0a 3c  ORDER BY c, a;.<
28f0: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 68 32  /codeblock>..<h2
2900: 3e 54 68 65 20 46 49 4c 54 45 52 20 43 6c 61 75  >The FILTER Clau
2910: 73 65 3c 2f 68 32 3e 0a 0a 3c 70 3e 49 66 20 61  se</h2>..<p>If a
2920: 20 46 49 4c 54 45 52 20 63 6c 61 75 73 65 20 69   FILTER clause i
2930: 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e  s provided, then
2940: 20 6f 6e 6c 79 20 72 6f 77 73 20 66 6f 72 20 77   only rows for w
2950: 68 69 63 68 20 74 68 65 20 3c 69 3e 65 78 70 72  hich the <i>expr
2960: 3c 2f 69 3e 20 69 73 0a 74 72 75 65 20 61 72 65  </i> is.true are
2970: 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
2980: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 2e 20 54   window frame. T
2990: 68 65 20 61 67 67 72 65 67 61 74 65 20 77 69 6e  he aggregate win
29a0: 64 6f 77 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  dow still return
29b0: 73 20 61 0a 76 61 6c 75 65 20 66 6f 72 20 65 76  s a.value for ev
29c0: 65 72 79 20 72 6f 77 2c 20 62 75 74 20 74 68 6f  ery row, but tho
29d0: 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
29e0: 20 46 49 4c 54 45 52 20 65 78 70 72 65 73 73 69   FILTER expressi
29f0: 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 0a  on evaluates to.
2a00: 6f 74 68 65 72 20 74 68 61 6e 20 74 72 75 65 20  other than true 
2a10: 61 72 65 20 6e 6f 74 20 69 6e 63 6c 75 64 65 64  are not included
2a20: 20 69 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66   in the window f
2a30: 72 61 6d 65 20 66 6f 72 20 61 6e 79 20 72 6f 77  rame for any row
2a40: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a  . For example:..
2a50: 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69  <codeblock>.  <i
2a60: 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >-- The followin
2a70: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
2a80: 6e 74 20 72 65 74 75 72 6e 73 3a 3c 2f 69 3e 0a  nt returns:</i>.
2a90: 20 20 3c 69 3e 2d 2d 20 3c 2f 69 3e 0a 20 20 3c    <i>-- </i>.  <
2aa0: 69 3e 2d 2d 20 20 20 63 20 20 20 20 20 7c 20 61  i>--   c     | a
2ab0: 20 7c 20 62 20 7c 20 67 72 6f 75 70 5f 63 6f 6e   | b | group_con
2ac0: 63 61 74 3c 2f 69 3e 0a 20 20 2d 2d 2d 2d 2d 2d  cat</i>.  ------
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 3c 69  -----------.  <i
2af0: 3e 2d 2d 20 20 20 6f 6e 65 20 20 20 7c 20 31 20  >--   one   | 1 
2b00: 7c 20 41 20 7c 20 41 20 20 20 20 20 20 20 20 20  | A | A         
2b10: 20 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20    </i>.  <i>--  
2b20: 20 74 77 6f 20 20 20 7c 20 32 20 7c 20 42 20 7c   two   | 2 | B |
2b30: 20 41 20 20 20 20 20 20 20 20 20 20 20 3c 2f 69   A           </i
2b40: 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 74 68 72 65  >.  <i>--   thre
2b50: 65 20 7c 20 33 20 7c 20 43 20 7c 20 41 2e 43 20  e | 3 | C | A.C 
2b60: 20 20 20 20 20 20 20 20 3c 2f 69 3e 0a 20 20 3c          </i>.  <
2b70: 69 3e 2d 2d 20 20 20 6f 6e 65 20 20 20 7c 20 34  i>--   one   | 4
2b80: 20 7c 20 44 20 7c 20 41 2e 43 2e 44 20 20 20 20   | D | A.C.D    
2b90: 20 20 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20     </i>.  <i>-- 
2ba0: 20 20 74 77 6f 20 20 20 7c 20 35 20 7c 20 45 20    two   | 5 | E 
2bb0: 7c 20 41 2e 43 2e 44 20 20 20 20 20 20 20 3c 2f  | A.C.D       </
2bc0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 74 68 72  i>.  <i>--   thr
2bd0: 65 65 20 7c 20 36 20 7c 20 46 20 7c 20 41 2e 43  ee | 6 | F | A.C
2be0: 2e 44 2e 46 20 20 20 20 20 3c 2f 69 3e 0a 20 20  .D.F     </i>.  
2bf0: 3c 69 3e 2d 2d 20 20 20 6f 6e 65 20 20 20 7c 20  <i>--   one   | 
2c00: 37 20 7c 20 47 20 7c 20 41 2e 43 2e 44 2e 46 2e  7 | G | A.C.D.F.
2c10: 47 20 20 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  G   </i>.  <i>--
2c20: 20 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 63   </i>.  SELECT c
2c30: 2c 20 61 2c 20 62 2c 20 67 72 6f 75 70 5f 63 6f  , a, b, group_co
2c40: 6e 63 61 74 28 62 2c 20 27 2e 27 29 20 46 49 4c  ncat(b, '.') FIL
2c50: 54 45 52 20 28 57 48 45 52 45 20 63 21 3d 27 74  TER (WHERE c!='t
2c60: 77 6f 27 29 20 4f 56 45 52 20 28 0a 20 20 20 20  wo') OVER (.    
2c70: 4f 52 44 45 52 20 42 59 20 61 0a 20 20 29 20 41  ORDER BY a.  ) A
2c80: 53 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 0a 20  S group_concat. 
2c90: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
2ca0: 59 20 61 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  Y a;.</codeblock
2cb0: 3e 0a 0a 3c 68 31 3e 42 75 69 6c 74 2d 69 6e 20  >..<h1>Built-in 
2cc0: 57 69 6e 64 6f 77 20 46 75 6e 63 74 69 6f 6e 73  Window Functions
2cd0: 3c 2f 68 31 3e 0a 0a 3c 70 3e 20 41 73 20 77 65  </h1>..<p> As we
2ce0: 6c 6c 20 61 73 20 61 67 67 72 65 67 61 74 65 20  ll as aggregate 
2cf0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
2d00: 2c 20 53 51 4c 69 74 65 20 66 65 61 74 75 72 65  , SQLite feature
2d10: 73 20 61 20 73 65 74 20 6f 66 20 62 75 69 6c 74  s a set of built
2d20: 2d 69 6e 0a 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in.window funct
2d30: 69 6f 6e 73 20 62 61 73 65 64 20 6f 6e 20 0a 3c  ions based on .<
2d40: 61 20 68 72 65 66 3d 68 74 74 70 73 3a 2f 2f 77  a href=https://w
2d50: 77 77 2e 70 6f 73 74 67 72 65 73 71 6c 2e 6f 72  ww.postgresql.or
2d60: 67 2f 64 6f 63 73 2f 31 30 2f 73 74 61 74 69 63  g/docs/10/static
2d70: 2f 66 75 6e 63 74 69 6f 6e 73 2d 77 69 6e 64 6f  /functions-windo
2d80: 77 2e 68 74 6d 6c 3e 0a 74 68 6f 73 65 20 73 75  w.html>.those su
2d90: 70 70 6f 72 74 65 64 20 62 79 20 50 6f 73 74 67  pported by Postg
2da0: 72 65 53 51 4c 3c 2f 61 3e 2e 0a 0a 3c 70 3e 20  reSQL</a>...<p> 
2db0: 42 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20  Built-in window 
2dc0: 66 75 6e 63 74 69 6f 6e 73 20 68 6f 6e 6f 72 20  functions honor 
2dd0: 61 6e 79 20 50 41 52 54 49 54 49 4f 4e 20 42 59  any PARTITION BY
2de0: 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 73   clause in the s
2df0: 61 6d 65 20 77 61 79 0a 61 73 20 61 67 67 72 65  ame way.as aggre
2e00: 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63  gate window func
2e10: 74 69 6f 6e 73 20 2d 20 65 61 63 68 20 73 65 6c  tions - each sel
2e20: 65 63 74 65 64 20 72 6f 77 20 69 73 20 61 73 73  ected row is ass
2e30: 69 67 6e 65 64 20 74 6f 20 61 20 70 61 72 74 69  igned to a parti
2e40: 74 69 6f 6e 20 0a 61 6e 64 20 65 61 63 68 20 70  tion .and each p
2e50: 61 72 74 69 74 69 6f 6e 20 69 73 20 70 72 6f 63  artition is proc
2e60: 65 73 73 65 64 20 73 65 70 61 72 61 74 65 6c 79  essed separately
2e70: 2e 20 54 68 65 20 77 61 79 73 20 69 6e 20 77 68  . The ways in wh
2e80: 69 63 68 20 61 6e 79 20 4f 52 44 45 52 20 42 59  ich any ORDER BY
2e90: 0a 63 6c 61 75 73 65 20 61 66 66 65 63 74 73 20  .clause affects 
2ea0: 65 61 63 68 20 62 75 69 6c 74 2d 69 6e 20 77 69  each built-in wi
2eb0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 73  ndow function is
2ec0: 20 64 65 73 63 72 69 62 65 64 20 62 65 6c 6f 77   described below
2ed0: 2e 20 53 6f 6d 65 20 6f 66 0a 74 68 65 20 77 69  . Some of.the wi
2ee0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28  ndow functions (
2ef0: 72 61 6e 6b 28 29 2c 20 64 65 6e 73 65 5f 72 61  rank(), dense_ra
2f00: 6e 6b 28 29 2c 20 70 65 72 63 65 6e 74 5f 72 61  nk(), percent_ra
2f10: 6e 6b 28 29 20 61 6e 64 20 6e 74 69 6c 65 28 29  nk() and ntile()
2f20: 29 20 75 73 65 0a 74 68 65 20 63 6f 6e 63 65 70  ) use.the concep
2f30: 74 20 6f 66 20 22 70 65 65 72 20 67 72 6f 75 70  t of "peer group
2f40: 73 22 20 28 72 6f 77 73 20 77 69 74 68 69 6e 20  s" (rows within 
2f50: 74 68 65 20 73 61 6d 65 20 70 61 72 74 69 74 69  the same partiti
2f60: 6f 6e 20 74 68 61 74 20 68 61 76 65 20 74 68 65  on that have the
2f70: 0a 73 61 6d 65 20 76 61 6c 75 65 73 20 66 6f 72  .same values for
2f80: 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 65 78   all ORDER BY ex
2f90: 70 72 65 73 73 69 6f 6e 73 29 2e 20 49 6e 20 74  pressions). In t
2fa0: 68 65 73 65 20 63 61 73 65 73 2c 20 69 74 20 64  hese cases, it d
2fb0: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 0a 77  oes not matter.w
2fc0: 68 65 74 68 65 72 20 74 68 65 20 3c 69 3e 26 6c  hether the <i>&l
2fd0: 74 3b 66 72 61 6d 65 2d 73 70 65 63 69 66 69 63  t;frame-specific
2fe0: 61 74 69 6f 6e 26 67 74 3b 3c 2f 69 3e 20 73 70  ation&gt;</i> sp
2ff0: 65 63 69 66 69 65 73 20 52 4f 57 53 20 6f 72 20  ecifies ROWS or 
3000: 52 41 4e 47 45 20 2d 20 66 6f 72 0a 74 68 65 20  RANGE - for.the 
3010: 70 75 72 70 6f 73 65 73 20 6f 66 20 62 75 69 6c  purposes of buil
3020: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
3030: 74 69 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 2c  tion processing,
3040: 20 72 6f 77 73 20 77 69 74 68 20 74 68 65 20 73   rows with the s
3050: 61 6d 65 20 76 61 6c 75 65 73 0a 66 6f 72 20 61  ame values.for a
3060: 6c 6c 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  ll ORDER BY expr
3070: 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6e 73  essions are cons
3080: 69 64 65 72 65 64 20 70 65 65 72 73 20 72 65 67  idered peers reg
3090: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 66  ardless of the f
30a0: 72 61 6d 65 20 74 79 70 65 2e 0a 0a 3c 70 3e 20  rame type...<p> 
30b0: 4d 6f 73 74 20 62 75 69 6c 74 2d 69 6e 20 77 69  Most built-in wi
30c0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 69  ndow functions i
30d0: 67 6e 6f 72 65 20 74 68 65 0a 3c 69 3e 26 6c 74  gnore the.<i>&lt
30e0: 3b 66 72 61 6d 65 2d 73 70 65 63 69 66 69 63 61  ;frame-specifica
30f0: 74 69 6f 6e 26 67 74 3b 3c 2f 69 3e 2c 20 74 68  tion&gt;</i>, th
3100: 65 20 65 78 63 65 70 74 69 6f 6e 73 20 62 65 69  e exceptions bei
3110: 6e 67 20 66 69 72 73 74 5f 76 61 6c 75 65 28 29  ng first_value()
3120: 2c 0a 6c 61 73 74 5f 76 61 6c 75 65 28 29 20 61  ,.last_value() a
3130: 6e 64 20 6e 74 68 5f 76 61 6c 75 65 28 29 2e 20  nd nth_value(). 
3140: 49 74 20 69 73 20 61 20 73 79 6e 74 61 78 20 65  It is a syntax e
3150: 72 72 6f 72 20 74 6f 20 73 70 65 63 69 66 79 20  rror to specify 
3160: 61 20 46 49 4c 54 45 52 20 0a 63 6c 61 75 73 65  a FILTER .clause
3170: 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 62 75   as part of a bu
3180: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
3190: 6e 63 74 69 6f 6e 20 69 6e 76 6f 63 61 74 69 6f  nction invocatio
31a0: 6e 2e 0a 0a 3c 70 3e 20 53 51 4c 69 74 65 20 73  n...<p> SQLite s
31b0: 75 70 70 6f 72 74 73 20 74 68 65 20 66 6f 6c 6c  upports the foll
31c0: 6f 77 69 6e 67 20 31 31 20 62 75 69 6c 74 2d 69  owing 11 built-i
31d0: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
31e0: 6e 73 3a 0a 0a 3c 64 6c 3e 0a 20 20 3c 64 74 3e  ns:..<dl>.  <dt>
31f0: 3c 70 3e 3c 62 3e 72 6f 77 5f 6e 75 6d 62 65 72  <p><b>row_number
3200: 28 29 3c 2f 62 3e 0a 20 20 3c 64 64 3e 3c 70 3e  ()</b>.  <dd><p>
3210: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
3220: 68 65 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68  he row within th
3230: 65 20 63 75 72 72 65 6e 74 20 70 61 72 74 69 74  e current partit
3240: 69 6f 6e 2e 20 52 6f 77 73 20 61 72 65 0a 20 20  ion. Rows are.  
3250: 20 20 20 20 20 6e 75 6d 62 65 72 65 64 20 73 74       numbered st
3260: 61 72 74 69 6e 67 20 66 72 6f 6d 20 31 20 69 6e  arting from 1 in
3270: 20 74 68 65 20 6f 72 64 65 72 20 64 65 66 69 6e   the order defin
3280: 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52 20  ed by the ORDER 
3290: 42 59 20 63 6c 61 75 73 65 20 69 6e 0a 20 20 20  BY clause in.   
32a0: 20 20 20 20 74 68 65 20 77 69 6e 64 6f 77 20 64      the window d
32b0: 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 20 69 6e  efinition, or in
32c0: 20 61 72 62 69 74 72 61 72 79 20 6f 72 64 65 72   arbitrary order
32d0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 20 20 3c 64   otherwise..  <d
32e0: 74 3e 3c 70 3e 3c 62 3e 72 61 6e 6b 28 29 3c 2f  t><p><b>rank()</
32f0: 62 3e 0a 20 20 3c 64 64 3e 3c 70 3e 20 54 68 65  b>.  <dd><p> The
3300: 20 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 6f 66   row_number() of
3310: 20 74 68 65 20 66 69 72 73 74 20 70 65 65 72 20   the first peer 
3320: 69 6e 20 65 61 63 68 20 67 72 6f 75 70 20 2d 20  in each group - 
3330: 74 68 65 20 72 61 6e 6b 20 6f 66 20 74 68 65 0a  the rank of the.
3340: 20 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 72         current r
3350: 6f 77 20 77 69 74 68 20 67 61 70 73 2e 20 49 66  ow with gaps. If
3360: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
3370: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
3380: 65 6e 20 61 6c 6c 20 72 6f 77 73 0a 20 20 20 20  en all rows.    
3390: 20 20 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65     are considere
33a0: 64 20 70 65 65 72 73 20 61 6e 64 20 74 68 69 73  d peers and this
33b0: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
33c0: 20 72 65 74 75 72 6e 73 20 31 2e 0a 20 20 3c 64   returns 1..  <d
33d0: 74 3e 3c 70 3e 3c 62 3e 64 65 6e 73 65 5f 72 61  t><p><b>dense_ra
33e0: 6e 6b 28 29 3c 2f 62 3e 0a 20 20 3c 64 64 3e 3c  nk()</b>.  <dd><
33f0: 70 3e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  p> The number of
3400: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
3410: 27 73 20 70 65 65 72 20 67 72 6f 75 70 20 77 69  's peer group wi
3420: 74 68 69 6e 20 69 74 73 20 70 61 72 74 69 74 69  thin its partiti
3430: 6f 6e 20 2d 20 74 68 65 0a 20 20 20 20 20 20 20  on - the.       
3440: 72 61 6e 6b 20 6f 66 20 74 68 65 20 63 75 72 72  rank of the curr
3450: 65 6e 74 20 72 6f 77 20 77 69 74 68 6f 75 74 20  ent row without 
3460: 67 61 70 73 2e 20 50 61 72 74 69 74 69 6f 6e 73  gaps. Partitions
3470: 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
3480: 61 72 74 69 6e 67 0a 20 20 20 20 20 20 20 66 72  arting.       fr
3490: 6f 6d 20 31 20 69 6e 20 74 68 65 20 6f 72 64 65  om 1 in the orde
34a0: 72 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 65  r defined by the
34b0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
34c0: 20 69 6e 20 74 68 65 20 77 69 6e 64 6f 77 0a 20   in the window. 
34d0: 20 20 20 20 20 20 64 65 66 69 6e 69 74 69 6f 6e        definition
34e0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
34f0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
3500: 2c 20 74 68 65 6e 20 61 6c 6c 20 72 6f 77 73 20  , then all rows 
3510: 61 72 65 0a 20 20 20 20 20 20 20 63 6f 6e 73 69  are.       consi
3520: 64 65 72 65 64 20 70 65 65 72 73 20 61 6e 64 20  dered peers and 
3530: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  this function al
3540: 77 61 79 73 20 72 65 74 75 72 6e 73 20 31 2e 0a  ways returns 1..
3550: 20 20 3c 64 74 3e 3c 70 3e 3c 62 3e 70 65 72 63    <dt><p><b>perc
3560: 65 6e 74 5f 72 61 6e 6b 28 29 3c 2f 62 3e 0a 20  ent_rank()</b>. 
3570: 20 3c 64 64 3e 3c 70 3e 20 44 65 73 70 69 74 65   <dd><p> Despite
3580: 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 69 73 20   the name, this 
3590: 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
35a0: 72 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20  returns a value 
35b0: 62 65 74 77 65 65 6e 20 30 2e 30 0a 20 20 20 20  between 0.0.    
35c0: 20 20 20 61 6e 64 20 31 2e 30 20 65 71 75 61 6c     and 1.0 equal
35d0: 20 74 6f 20 28 3c 69 3e 72 61 6e 6b 3c 2f 69 3e   to (<i>rank</i>
35e0: 20 2d 20 31 29 2f 28 3c 69 3e 70 61 72 74 69 74   - 1)/(<i>partit
35f0: 69 6f 6e 2d 72 6f 77 73 3c 2f 69 3e 20 2d 20 31  ion-rows</i> - 1
3600: 29 2c 20 77 68 65 72 65 0a 20 20 20 20 20 20 20  ), where.       
3610: 3c 69 3e 72 61 6e 6b 3c 2f 69 3e 20 69 73 20 74  <i>rank</i> is t
3620: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
3630: 64 20 62 79 20 62 75 69 6c 74 2d 69 6e 20 77 69  d by built-in wi
3640: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 72 61  ndow function ra
3650: 6e 6b 28 29 0a 20 20 20 20 20 20 20 61 6e 64 20  nk().       and 
3660: 3c 69 3e 70 61 72 74 69 74 69 6f 6e 2d 72 6f 77  <i>partition-row
3670: 73 3c 2f 69 3e 20 69 73 20 74 68 65 20 74 6f 74  s</i> is the tot
3680: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  al number of row
3690: 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
36a0: 70 61 72 74 69 74 69 6f 6e 2e 20 49 66 20 74 68  partition. If th
36b0: 65 20 70 61 72 74 69 74 69 6f 6e 20 63 6f 6e 74  e partition cont
36c0: 61 69 6e 73 20 6f 6e 6c 79 20 6f 6e 65 20 72 6f  ains only one ro
36d0: 77 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  w, this function
36e0: 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 73 20  .       returns 
36f0: 30 2e 30 2e 0a 20 20 3c 64 74 3e 3c 70 3e 3c 62  0.0..  <dt><p><b
3700: 3e 63 75 6d 65 5f 64 69 73 74 28 29 3c 2f 62 3e  >cume_dist()</b>
3710: 0a 20 20 3c 64 64 3e 3c 70 3e 20 54 68 65 20 63  .  <dd><p> The c
3720: 75 6d 75 6c 61 74 69 76 65 20 64 69 73 74 72 69  umulative distri
3730: 62 75 74 69 6f 6e 2e 20 43 61 6c 63 75 6c 61 74  bution. Calculat
3740: 65 64 20 61 73 0a 20 20 20 20 20 20 20 3c 69 3e  ed as.       <i>
3750: 72 6f 77 2d 6e 75 6d 62 65 72 3c 2f 69 3e 2f 3c  row-number</i>/<
3760: 69 3e 70 61 72 74 69 74 69 6f 6e 2d 72 6f 77 73  i>partition-rows
3770: 3c 2f 69 3e 2c 20 77 68 65 72 65 20 3c 69 3e 72  </i>, where <i>r
3780: 6f 77 2d 6e 75 6d 62 65 72 3c 2f 69 3e 20 69 73  ow-number</i> is
3790: 0a 20 20 20 20 20 20 20 74 68 65 20 76 61 6c 75  .       the valu
37a0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 72 6f  e returned by ro
37b0: 77 5f 6e 75 6d 62 65 72 28 29 20 66 6f 72 20 74  w_number() for t
37c0: 68 65 20 6c 61 73 74 20 70 65 65 72 20 69 6e 20  he last peer in 
37d0: 74 68 65 20 67 72 6f 75 70 0a 20 20 20 20 20 20  the group.      
37e0: 20 61 6e 64 20 3c 69 3e 70 61 72 74 69 74 69 6f   and <i>partitio
37f0: 6e 2d 72 6f 77 73 3c 2f 69 3e 20 74 68 65 20 6e  n-rows</i> the n
3800: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
3810: 20 74 68 65 20 70 61 72 74 69 74 69 6f 6e 2e 0a   the partition..
3820: 20 20 3c 64 74 3e 3c 70 3e 3c 62 3e 6e 74 69 6c    <dt><p><b>ntil
3830: 65 28 4e 29 3c 2f 62 3e 0a 20 20 3c 64 64 3e 3c  e(N)</b>.  <dd><
3840: 70 3e 20 41 72 67 75 6d 65 6e 74 20 3c 69 3e 4e  p> Argument <i>N
3850: 3c 2f 69 3e 20 69 73 20 68 61 6e 64 6c 65 64 20  </i> is handled 
3860: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 54  as an integer. T
3870: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 76  his function div
3880: 69 64 65 73 20 74 68 65 0a 20 20 20 20 20 20 20  ides the.       
3890: 70 61 72 74 69 74 69 6f 6e 20 69 6e 74 6f 20 4e  partition into N
38a0: 20 67 72 6f 75 70 73 20 61 73 20 65 76 65 6e 6c   groups as evenl
38b0: 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 61 6e  y as possible an
38c0: 64 20 61 73 73 69 67 6e 73 20 61 6e 20 69 6e 74  d assigns an int
38d0: 65 67 65 72 0a 20 20 20 20 20 20 20 62 65 74 77  eger.       betw
38e0: 65 65 6e 20 31 20 61 6e 64 20 3c 69 3e 4e 3c 2f  een 1 and <i>N</
38f0: 69 3e 20 74 6f 20 65 61 63 68 20 67 72 6f 75 70  i> to each group
3900: 2c 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 64  , in the order d
3910: 65 66 69 6e 65 64 20 62 79 20 74 68 65 20 4f 52  efined by the OR
3920: 44 45 52 0a 20 20 20 20 20 20 20 42 59 20 63 6c  DER.       BY cl
3930: 61 75 73 65 2c 20 6f 72 20 69 6e 20 61 72 62 69  ause, or in arbi
3940: 74 72 61 72 79 20 6f 72 64 65 72 20 6f 74 68 65  trary order othe
3950: 72 77 69 73 65 2e 20 49 66 20 6e 65 63 65 73 73  rwise. If necess
3960: 61 72 79 2c 20 6c 61 72 67 65 72 20 67 72 6f 75  ary, larger grou
3970: 70 73 0a 20 20 20 20 20 20 20 6f 63 63 75 72 20  ps.       occur 
3980: 66 69 72 73 74 2e 20 54 68 69 73 20 66 75 6e 63  first. This func
3990: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
39a0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 61   integer value a
39b0: 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 20  ssigned to the. 
39c0: 20 20 20 20 20 20 67 72 6f 75 70 20 74 68 61 74        group that
39d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
39e0: 20 69 73 20 61 20 70 61 72 74 20 6f 66 2e 0a 0a   is a part of...
39f0: 20 20 3c 64 74 3e 3c 70 3e 3c 62 3e 6c 61 67 28    <dt><p><b>lag(
3a00: 65 78 70 72 29 3c 62 72 3e 6c 61 67 28 65 78 70  expr)<br>lag(exp
3a10: 72 2c 20 6f 66 66 73 65 74 29 3c 62 72 3e 6c 61  r, offset)<br>la
3a20: 67 28 65 78 70 72 2c 20 6f 66 66 73 65 74 2c 20  g(expr, offset, 
3a30: 64 65 66 61 75 6c 74 29 3c 2f 62 3e 0a 20 20 3c  default)</b>.  <
3a40: 64 64 3e 3c 70 3e 20 54 68 65 20 66 69 72 73 74  dd><p> The first
3a50: 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 6c 61 67   form of the lag
3a60: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
3a70: 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f  rns the result o
3a80: 66 20 65 76 61 6c 75 61 74 69 6e 67 0a 20 20 20  f evaluating.   
3a90: 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e 20 3c      expression <
3aa0: 69 3e 65 78 70 72 3c 2f 69 3e 20 61 67 61 69 6e  i>expr</i> again
3ab0: 73 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  st the previous 
3ac0: 72 6f 77 20 69 6e 20 74 68 65 20 70 61 72 74 69  row in the parti
3ad0: 74 69 6f 6e 2e 20 4f 72 2c 20 69 66 0a 20 20 20  tion. Or, if.   
3ae0: 20 20 20 20 74 68 65 72 65 20 69 73 20 6e 6f 20      there is no 
3af0: 70 72 65 76 69 6f 75 73 20 72 6f 77 20 28 62 65  previous row (be
3b00: 63 61 75 73 65 20 74 68 65 20 63 75 72 72 65 6e  cause the curren
3b10: 74 20 72 6f 77 20 69 73 20 74 68 65 20 66 69 72  t row is the fir
3b20: 73 74 29 2c 20 4e 55 4c 4c 2e 0a 0a 20 20 20 20  st), NULL...    
3b30: 20 20 3c 70 3e 20 49 66 20 74 68 65 20 3c 69 3e    <p> If the <i>
3b40: 6f 66 66 73 65 74 3c 2f 69 3e 20 61 72 67 75 6d  offset</i> argum
3b50: 65 6e 74 20 69 73 20 70 72 6f 76 69 64 65 64 2c  ent is provided,
3b60: 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65   then it must be
3b70: 20 61 0a 20 20 20 20 20 20 20 6e 6f 6e 2d 6e 65   a.       non-ne
3b80: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e 20  gative integer. 
3b90: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
3ba0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
3bb0: 69 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  is the result.  
3bc0: 20 20 20 20 20 6f 66 20 65 76 61 6c 75 61 74 69       of evaluati
3bd0: 6e 67 20 3c 69 3e 65 78 70 72 3c 2f 69 3e 20 61  ng <i>expr</i> a
3be0: 67 61 69 6e 73 74 20 74 68 65 20 72 6f 77 20 3c  gainst the row <
3bf0: 69 3e 6f 66 66 73 65 74 3c 2f 69 3e 20 72 6f 77  i>offset</i> row
3c00: 73 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  s before the.   
3c10: 20 20 20 20 63 75 72 72 65 6e 74 20 72 6f 77 20      current row 
3c20: 77 69 74 68 69 6e 20 74 68 65 20 70 61 72 74 69  within the parti
3c30: 74 69 6f 6e 2e 20 49 66 20 3c 69 3e 6f 66 66 73  tion. If <i>offs
3c40: 65 74 3c 2f 69 3e 20 69 73 20 30 2c 20 74 68 65  et</i> is 0, the
3c50: 6e 0a 20 20 20 20 20 20 20 3c 69 3e 65 78 70 72  n.       <i>expr
3c60: 3c 2f 69 3e 20 69 73 20 65 76 61 6c 75 61 74 65  </i> is evaluate
3c70: 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 63 75  d against the cu
3c80: 72 72 65 6e 74 20 72 6f 77 2e 20 49 66 20 74 68  rrent row. If th
3c90: 65 72 65 20 69 73 20 6e 6f 20 72 6f 77 0a 20 20  ere is no row.  
3ca0: 20 20 20 20 20 3c 69 3e 6f 66 66 73 65 74 3c 2f       <i>offset</
3cb0: 69 3e 20 72 6f 77 73 20 62 65 66 6f 72 65 20 74  i> rows before t
3cc0: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2c 20  he current row, 
3cd0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
3ce0: 2e 0a 0a 20 20 20 20 20 20 3c 70 3e 20 49 66 20  ...      <p> If 
3cf0: 3c 69 3e 64 65 66 61 75 6c 74 3c 2f 69 3e 20 69  <i>default</i> i
3d00: 73 20 61 6c 73 6f 20 70 72 6f 76 69 64 65 64 2c  s also provided,
3d10: 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75   then it is retu
3d20: 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  rned instead of.
3d30: 20 20 20 20 20 20 4e 55 4c 4c 20 69 66 20 72 6f        NULL if ro
3d40: 77 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  w identified by 
3d50: 3c 69 3e 6f 66 66 73 65 74 3c 2f 69 3e 20 64 6f  <i>offset</i> do
3d60: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
3d70: 20 20 20 20 20 0a 20 20 3c 64 74 3e 3c 70 3e 3c       .  <dt><p><
3d80: 62 3e 6c 65 61 64 28 65 78 70 72 29 3c 62 72 3e  b>lead(expr)<br>
3d90: 6c 65 61 64 28 65 78 70 72 2c 20 6f 66 66 73 65  lead(expr, offse
3da0: 74 29 3c 62 72 3e 6c 65 61 64 28 65 78 70 72 2c  t)<br>lead(expr,
3db0: 20 6f 66 66 73 65 74 2c 20 64 65 66 61 75 6c 74   offset, default
3dc0: 29 3c 2f 62 3e 0a 20 20 3c 64 64 3e 3c 70 3e 20  )</b>.  <dd><p> 
3dd0: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 6f  The first form o
3de0: 66 20 74 68 65 20 6c 65 61 64 28 29 20 66 75 6e  f the lead() fun
3df0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
3e00: 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 61 6c  e result of eval
3e10: 75 61 74 69 6e 67 0a 20 20 20 20 20 20 20 65 78  uating.       ex
3e20: 70 72 65 73 73 69 6f 6e 20 3c 69 3e 65 78 70 72  pression <i>expr
3e30: 3c 2f 69 3e 20 61 67 61 69 6e 73 74 20 74 68 65  </i> against the
3e40: 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65   next row in the
3e50: 20 70 61 72 74 69 74 69 6f 6e 2e 20 4f 72 2c 20   partition. Or, 
3e60: 69 66 0a 20 20 20 20 20 20 20 74 68 65 72 65 20  if.       there 
3e70: 69 73 20 6e 6f 20 6e 65 78 74 20 72 6f 77 20 28  is no next row (
3e80: 62 65 63 61 75 73 65 20 74 68 65 20 63 75 72 72  because the curr
3e90: 65 6e 74 20 72 6f 77 20 69 73 20 74 68 65 20 6c  ent row is the l
3ea0: 61 73 74 29 2c 20 4e 55 4c 4c 2e 0a 0a 20 20 20  ast), NULL...   
3eb0: 20 20 20 3c 70 3e 20 49 66 20 74 68 65 20 3c 69     <p> If the <i
3ec0: 3e 6f 66 66 73 65 74 3c 2f 69 3e 20 61 72 67 75  >offset</i> argu
3ed0: 6d 65 6e 74 20 69 73 20 70 72 6f 76 69 64 65 64  ment is provided
3ee0: 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62  , then it must b
3ef0: 65 20 61 0a 20 20 20 20 20 20 20 6e 6f 6e 2d 6e  e a.       non-n
3f00: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e  egative integer.
3f10: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
3f20: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
3f30: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20   is the result. 
3f40: 20 20 20 20 20 20 6f 66 20 65 76 61 6c 75 61 74        of evaluat
3f50: 69 6e 67 20 3c 69 3e 65 78 70 72 3c 2f 69 3e 20  ing <i>expr</i> 
3f60: 61 67 61 69 6e 73 74 20 74 68 65 20 72 6f 77 20  against the row 
3f70: 3c 69 3e 6f 66 66 73 65 74 3c 2f 69 3e 20 72 6f  <i>offset</i> ro
3f80: 77 73 20 61 66 74 65 72 20 74 68 65 0a 20 20 20  ws after the.   
3f90: 20 20 20 20 63 75 72 72 65 6e 74 20 72 6f 77 20      current row 
3fa0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 72 74 69  within the parti
3fb0: 74 69 6f 6e 2e 20 49 66 20 3c 69 3e 6f 66 66 73  tion. If <i>offs
3fc0: 65 74 3c 2f 69 3e 20 69 73 20 30 2c 20 74 68 65  et</i> is 0, the
3fd0: 6e 0a 20 20 20 20 20 20 20 3c 69 3e 65 78 70 72  n.       <i>expr
3fe0: 3c 2f 69 3e 20 69 73 20 65 76 61 6c 75 61 74 65  </i> is evaluate
3ff0: 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 63 75  d against the cu
4000: 72 72 65 6e 74 20 72 6f 77 2e 20 49 66 20 74 68  rrent row. If th
4010: 65 72 65 20 69 73 20 6e 6f 20 72 6f 77 0a 20 20  ere is no row.  
4020: 20 20 20 20 20 3c 69 3e 6f 66 66 73 65 74 3c 2f       <i>offset</
4030: 69 3e 20 72 6f 77 73 20 61 66 74 65 72 20 74 68  i> rows after th
4040: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2c 20 4e  e current row, N
4050: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
4060: 0a 0a 20 20 20 20 20 20 3c 70 3e 20 49 66 20 3c  ..      <p> If <
4070: 69 3e 64 65 66 61 75 6c 74 3c 2f 69 3e 20 69 73  i>default</i> is
4080: 20 61 6c 73 6f 20 70 72 6f 76 69 64 65 64 2c 20   also provided, 
4090: 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72  then it is retur
40a0: 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 20  ned instead of. 
40b0: 20 20 20 20 20 4e 55 4c 4c 20 69 66 20 72 6f 77       NULL if row
40c0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 3c   identified by <
40d0: 69 3e 6f 66 66 73 65 74 3c 2f 69 3e 20 64 6f 65  i>offset</i> doe
40e0: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 3c  s not exist..  <
40f0: 64 74 3e 3c 70 3e 3c 62 3e 66 69 72 73 74 5f 76  dt><p><b>first_v
4100: 61 6c 75 65 28 65 78 70 72 29 3c 2f 62 3e 0a 20  alue(expr)</b>. 
4110: 20 3c 64 64 3e 3c 70 3e 20 54 68 69 73 20 62 75   <dd><p> This bu
4120: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
4130: 6e 63 74 69 6f 6e 20 63 61 6c 63 75 6c 61 74 65  nction calculate
4140: 73 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  s the window fra
4150: 6d 65 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20  me for each.    
4160: 20 20 20 72 6f 77 20 69 6e 20 74 68 65 20 73 61     row in the sa
4170: 6d 65 20 77 61 79 20 61 73 20 61 6e 20 61 67 67  me way as an agg
4180: 72 65 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75  regate window fu
4190: 6e 63 74 69 6f 6e 2e 20 49 74 20 72 65 74 75 72  nction. It retur
41a0: 6e 73 20 74 68 65 0a 20 20 20 20 20 20 20 76 61  ns the.       va
41b0: 6c 75 65 20 6f 66 20 3c 69 3e 65 78 70 72 3c 2f  lue of <i>expr</
41c0: 69 3e 20 65 76 61 6c 75 61 74 65 64 20 61 67 61  i> evaluated aga
41d0: 69 6e 73 74 20 74 68 65 20 66 69 72 73 74 20 72  inst the first r
41e0: 6f 77 20 69 6e 20 74 68 65 20 77 69 6e 64 6f 77  ow in the window
41f0: 20 66 72 61 6d 65 0a 20 20 20 20 20 20 20 66 6f   frame.       fo
4200: 72 20 65 61 63 68 20 72 6f 77 2e 0a 20 20 3c 64  r each row..  <d
4210: 74 3e 3c 70 3e 3c 62 3e 6c 61 73 74 5f 76 61 6c  t><p><b>last_val
4220: 75 65 28 65 78 70 72 29 3c 2f 62 3e 0a 20 20 3c  ue(expr)</b>.  <
4230: 64 64 3e 3c 70 3e 20 54 68 69 73 20 62 75 69 6c  dd><p> This buil
4240: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
4250: 74 69 6f 6e 20 63 61 6c 63 75 6c 61 74 65 73 20  tion calculates 
4260: 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65  the window frame
4270: 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 20 20   for each.      
4280: 20 72 6f 77 20 69 6e 20 74 68 65 20 73 61 6d 65   row in the same
4290: 20 77 61 79 20 61 73 20 61 6e 20 61 67 67 72 65   way as an aggre
42a0: 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63  gate window func
42b0: 74 69 6f 6e 2e 20 49 74 20 72 65 74 75 72 6e 73  tion. It returns
42c0: 20 74 68 65 0a 20 20 20 20 20 20 20 76 61 6c 75   the.       valu
42d0: 65 20 6f 66 20 3c 69 3e 65 78 70 72 3c 2f 69 3e  e of <i>expr</i>
42e0: 20 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e   evaluated again
42f0: 73 74 20 74 68 65 20 6c 61 73 74 20 72 6f 77 20  st the last row 
4300: 69 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72  in the window fr
4310: 61 6d 65 0a 20 20 20 20 20 20 20 66 6f 72 20 65  ame.       for e
4320: 61 63 68 20 72 6f 77 2e 0a 20 20 3c 64 74 3e 3c  ach row..  <dt><
4330: 70 3e 3c 62 3e 6e 74 68 5f 76 61 6c 75 65 28 65  p><b>nth_value(e
4340: 78 70 72 2c 20 4e 29 3c 2f 62 3e 0a 20 20 3c 64  xpr, N)</b>.  <d
4350: 64 3e 3c 70 3e 20 54 68 69 73 20 62 75 69 6c 74  d><p> This built
4360: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
4370: 69 6f 6e 20 63 61 6c 63 75 6c 61 74 65 73 20 74  ion calculates t
4380: 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  he window frame 
4390: 66 6f 72 20 65 61 63 68 0a 20 20 20 20 20 20 20  for each.       
43a0: 72 6f 77 20 69 6e 20 74 68 65 20 73 61 6d 65 20  row in the same 
43b0: 77 61 79 20 61 73 20 61 6e 20 61 67 67 72 65 67  way as an aggreg
43c0: 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ate window funct
43d0: 69 6f 6e 2e 20 49 74 20 72 65 74 75 72 6e 73 20  ion. It returns 
43e0: 74 68 65 0a 20 20 20 20 20 20 20 76 61 6c 75 65  the.       value
43f0: 20 6f 66 20 3c 69 3e 65 78 70 72 3c 2f 69 3e 20   of <i>expr</i> 
4400: 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 73  evaluated agains
4410: 74 20 74 68 65 20 72 6f 77 20 3c 69 3e 4e 3c 2f  t the row <i>N</
4420: 69 3e 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77  i> of the window
4430: 0a 20 20 20 20 20 20 20 66 72 61 6d 65 2e 20 52  .       frame. R
4440: 6f 77 73 20 61 72 65 20 6e 75 6d 62 65 72 65 64  ows are numbered
4450: 20 77 69 74 68 69 6e 20 74 68 65 20 77 69 6e 64   within the wind
4460: 6f 77 20 66 72 61 6d 65 20 73 74 61 72 74 69 6e  ow frame startin
4470: 67 20 66 72 6f 6d 20 31 20 69 6e 0a 20 20 20 20  g from 1 in.    
4480: 20 20 20 74 68 65 20 6f 72 64 65 72 20 64 65 66     the order def
4490: 69 6e 65 64 20 62 79 20 74 68 65 20 4f 52 44 45  ined by the ORDE
44a0: 52 20 42 59 20 63 6c 61 75 73 65 20 69 66 20 6f  R BY clause if o
44b0: 6e 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 6f  ne is present, o
44c0: 72 20 69 6e 0a 20 20 20 20 20 20 20 61 72 62 69  r in.       arbi
44d0: 74 72 61 72 79 20 6f 72 64 65 72 20 6f 74 68 65  trary order othe
44e0: 72 77 69 73 65 2e 20 49 66 20 74 68 65 72 65 20  rwise. If there 
44f0: 69 73 20 6e 6f 20 3c 69 3e 4e 3c 2f 69 3e 74 68  is no <i>N</i>th
4500: 20 72 6f 77 20 69 6e 20 74 68 65 0a 20 20 20 20   row in the.    
4510: 20 20 20 70 61 72 74 69 74 69 6f 6e 2c 20 74 68     partition, th
4520: 65 6e 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  en NULL is retur
4530: 6e 65 64 2e 0a 20 20 3c 64 64 3e 0a 3c 2f 64 6c  ned..  <dd>.</dl
4540: 3e 0a 0a 3c 70 3e 54 68 65 20 65 78 61 6d 70 6c  >..<p>The exampl
4550: 65 73 20 69 6e 20 74 68 69 73 20 73 65 63 74 69  es in this secti
4560: 6f 6e 20 61 6c 6c 20 61 73 73 75 6d 65 20 74 68  on all assume th
4570: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 61 74 61  e following data
4580: 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
4590: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
45a0: 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52 54  (a, b);.  INSERT
45b0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
45c0: 27 61 27 2c 20 27 6f 6e 65 27 29 2c 20 0a 20 20  'a', 'one'), .  
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45e0: 20 20 20 20 20 28 27 61 27 2c 20 27 74 77 6f 27       ('a', 'two'
45f0: 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ), .            
4600: 20 20 20 20 20 20 20 20 20 20 20 28 27 61 27 2c             ('a',
4610: 20 27 74 68 72 65 65 27 29 2c 20 0a 20 20 20 20   'three'), .    
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 28 27 62 27 2c 20 27 66 6f 75 72 27 29     ('b', 'four')
4640: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
4650: 20 20 20 20 20 20 20 20 20 20 28 27 63 27 2c 20            ('c', 
4660: 27 66 69 76 65 27 29 2c 20 0a 20 20 20 20 20 20  'five'), .      
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 28 27 63 27 2c 20 27 73 69 78 27 29 3b 0a 3c   ('c', 'six');.<
4690: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
46a0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  The following ex
46b0: 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72 61 74 65  ample illustrate
46c0: 73 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20  s the behaviour 
46d0: 6f 66 20 74 68 65 20 66 69 76 65 20 72 61 6e 6b  of the five rank
46e0: 69 6e 67 0a 66 75 6e 63 74 69 6f 6e 73 20 2d 20  ing.functions - 
46f0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 2c 20 72 61  row_number(), ra
4700: 6e 6b 28 29 2c 20 64 65 6e 73 65 5f 72 61 6e 6b  nk(), dense_rank
4710: 28 29 2c 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  (), percent_rank
4720: 28 29 20 61 6e 64 20 0a 63 75 6d 65 5f 64 69 73  () and .cume_dis
4730: 74 28 29 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  t()...<codeblock
4740: 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f  >.  <i>-- The fo
4750: 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73  llowing SELECT s
4760: 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73  tatement returns
4770: 3a 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 3c 2f  :</i>.  <i>-- </
4780: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 61 20 7c  i>.  <i>--   a |
4790: 20 72 6f 77 5f 6e 75 6d 62 65 72 20 7c 20 72 61   row_number | ra
47a0: 6e 6b 20 7c 20 64 65 6e 73 65 5f 72 61 6e 6b 20  nk | dense_rank 
47b0: 7c 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 20 7c  | percent_rank |
47c0: 20 63 75 6d 65 5f 64 69 73 74 3c 2f 69 3e 0a 20   cume_dist</i>. 
47d0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4810: 2d 2d 2d 0a 20 20 3c 69 3e 2d 2d 20 20 20 61 20  ---.  <i>--   a 
4820: 7c 20 20 20 20 20 20 20 20 20 20 31 20 7c 20 20  |          1 |  
4830: 20 20 31 20 7c 20 20 20 20 20 20 20 20 20 20 31    1 |          1
4840: 20 7c 20 20 20 20 20 20 20 20 20 20 30 2e 30 20   |          0.0 
4850: 7c 20 20 20 20 20 20 20 30 2e 35 3c 2f 69 3e 0a  |       0.5</i>.
4860: 20 20 3c 69 3e 2d 2d 20 20 20 61 20 7c 20 20 20    <i>--   a |   
4870: 20 20 20 20 20 20 20 32 20 7c 20 20 20 20 31 20         2 |    1 
4880: 7c 20 20 20 20 20 20 20 20 20 20 31 20 7c 20 20  |          1 |  
4890: 20 20 20 20 20 20 20 20 30 2e 30 20 7c 20 20 20          0.0 |   
48a0: 20 20 20 20 30 2e 35 3c 2f 69 3e 0a 20 20 3c 69      0.5</i>.  <i
48b0: 3e 2d 2d 20 20 20 61 20 7c 20 20 20 20 20 20 20  >--   a |       
48c0: 20 20 20 33 20 7c 20 20 20 20 31 20 7c 20 20 20     3 |    1 |   
48d0: 20 20 20 20 20 20 20 31 20 7c 20 20 20 20 20 20         1 |      
48e0: 20 20 20 20 30 2e 30 20 7c 20 20 20 20 20 20 20      0.0 |       
48f0: 30 2e 35 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  0.5</i>.  <i>-- 
4900: 20 20 62 20 7c 20 20 20 20 20 20 20 20 20 20 34    b |          4
4910: 20 7c 20 20 20 20 34 20 7c 20 20 20 20 20 20 20   |    4 |       
4920: 20 20 20 32 20 7c 20 20 20 20 20 20 20 20 20 20     2 |          
4930: 30 2e 36 20 7c 20 20 20 20 20 20 20 30 2e 36 36  0.6 |       0.66
4940: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 63  </i>.  <i>--   c
4950: 20 7c 20 20 20 20 20 20 20 20 20 20 35 20 7c 20   |          5 | 
4960: 20 20 20 35 20 7c 20 20 20 20 20 20 20 20 20 20     5 |          
4970: 33 20 7c 20 20 20 20 20 20 20 20 20 20 30 2e 38  3 |          0.8
4980: 20 7c 20 20 20 20 20 20 20 31 2e 30 3c 2f 69 3e   |       1.0</i>
4990: 0a 20 20 3c 69 3e 2d 2d 20 20 20 63 20 7c 20 20  .  <i>--   c |  
49a0: 20 20 20 20 20 20 20 20 36 20 7c 20 20 20 20 35          6 |    5
49b0: 20 7c 20 20 20 20 20 20 20 20 20 20 33 20 7c 20   |          3 | 
49c0: 20 20 20 20 20 20 20 20 20 30 2e 38 20 7c 20 20           0.8 |  
49d0: 20 20 20 20 20 31 2e 30 3c 2f 69 3e 0a 20 20 3c       1.0</i>.  <
49e0: 69 3e 2d 2d 20 3c 2f 69 3e 0a 20 20 53 45 4c 45  i>-- </i>.  SELE
49f0: 43 54 20 61 20 20 20 20 20 20 20 20 20 20 20 20  CT a            
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 41 53 20 61              AS a
4a10: 2c 0a 20 20 20 20 20 20 20 20 20 72 6f 77 5f 6e  ,.         row_n
4a20: 75 6d 62 65 72 28 29 20 4f 56 45 52 20 77 69 6e  umber() OVER win
4a30: 20 20 20 20 41 53 20 72 6f 77 5f 6e 75 6d 62 65      AS row_numbe
4a40: 72 2c 0a 20 20 20 20 20 20 20 20 20 72 61 6e 6b  r,.         rank
4a50: 28 29 20 4f 56 45 52 20 77 69 6e 20 20 20 20 20  () OVER win     
4a60: 20 20 20 20 20 41 53 20 72 61 6e 6b 2c 0a 20 20       AS rank,.  
4a70: 20 20 20 20 20 20 20 64 65 6e 73 65 5f 72 61 6e         dense_ran
4a80: 6b 28 29 20 4f 56 45 52 20 77 69 6e 20 20 20 20  k() OVER win    
4a90: 41 53 20 64 65 6e 73 65 5f 72 61 6e 6b 2c 0a 20  AS dense_rank,. 
4aa0: 20 20 20 20 20 20 20 20 70 65 72 63 65 6e 74 5f          percent_
4ab0: 72 61 6e 6b 28 29 20 4f 56 45 52 20 77 69 6e 20  rank() OVER win 
4ac0: 20 41 53 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b   AS percent_rank
4ad0: 2c 0a 20 20 20 20 20 20 20 20 20 63 75 6d 65 5f  ,.         cume_
4ae0: 64 69 73 74 28 29 20 4f 56 45 52 20 77 69 6e 20  dist() OVER win 
4af0: 20 20 20 20 41 53 20 63 75 6d 65 5f 64 69 73 74      AS cume_dist
4b00: 0a 20 20 46 52 4f 4d 20 74 32 0a 20 20 57 49 4e  .  FROM t2.  WIN
4b10: 44 4f 57 20 77 69 6e 20 41 53 20 28 4f 52 44 45  DOW win AS (ORDE
4b20: 52 20 42 59 20 61 29 3b 0a 3c 2f 63 6f 64 65 62  R BY a);.</codeb
4b30: 6c 6f 63 6b 3e 0a 0a 3c 70 3e 54 68 65 20 65 78  lock>..<p>The ex
4b40: 61 6d 70 6c 65 20 62 65 6c 6f 77 20 75 73 65 73  ample below uses
4b50: 20 6e 74 69 6c 65 28 29 20 74 6f 20 64 69 76 64   ntile() to divd
4b60: 65 20 74 68 65 20 73 69 78 20 72 6f 77 73 20 69  e the six rows i
4b70: 6e 74 6f 20 74 77 6f 20 67 72 6f 75 70 73 20 28  nto two groups (
4b80: 74 68 65 0a 6e 74 69 6c 65 28 32 29 20 63 61 6c  the.ntile(2) cal
4b90: 6c 29 20 61 6e 64 20 69 6e 74 6f 20 66 6f 75 72  l) and into four
4ba0: 20 67 72 6f 75 70 73 20 28 74 68 65 20 6e 74 69   groups (the nti
4bb0: 6c 65 28 34 29 20 63 61 6c 6c 29 2e 20 46 6f 72  le(4) call). For
4bc0: 20 6e 74 69 6c 65 28 32 29 2c 20 74 68 65 72 65   ntile(2), there
4bd0: 0a 61 72 65 20 74 68 72 65 65 20 72 6f 77 73 20  .are three rows 
4be0: 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68  assigned to each
4bf0: 20 67 72 6f 75 70 2e 20 46 6f 72 20 6e 74 69 6c   group. For ntil
4c00: 65 28 34 29 2c 20 74 68 65 72 65 20 61 72 65 20  e(4), there are 
4c10: 74 77 6f 20 67 72 6f 75 70 73 20 6f 66 0a 74 77  two groups of.tw
4c20: 6f 20 61 6e 64 20 74 77 6f 20 67 72 6f 75 70 73  o and two groups
4c30: 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 6c 61 72   of one. The lar
4c40: 67 65 72 20 67 72 6f 75 70 73 20 6f 66 20 74 77  ger groups of tw
4c50: 6f 20 61 70 70 65 61 72 20 66 69 72 73 74 2e 0a  o appear first..
4c60: 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c  .<codeblock>.  <
4c70: 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69  i>-- The followi
4c80: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
4c90: 65 6e 74 20 72 65 74 75 72 6e 73 3a 3c 2f 69 3e  ent returns:</i>
4ca0: 0a 20 20 3c 69 3e 2d 2d 20 3c 2f 69 3e 0a 20 20  .  <i>-- </i>.  
4cb0: 3c 69 3e 2d 2d 20 20 20 61 20 7c 20 62 20 20 20  <i>--   a | b   
4cc0: 20 20 7c 20 6e 74 69 6c 65 5f 32 20 7c 20 6e 74    | ntile_2 | nt
4cd0: 69 6c 65 5f 34 3c 2f 69 3e 0a 20 20 2d 2d 2d 2d  ile_4</i>.  ----
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4d00: 20 3c 69 3e 2d 2d 20 20 20 61 20 7c 20 6f 6e 65   <i>--   a | one
4d10: 20 20 20 7c 20 20 20 20 20 20 20 31 20 7c 20 20     |       1 |  
4d20: 20 20 20 20 20 31 3c 2f 69 3e 0a 20 20 3c 69 3e       1</i>.  <i>
4d30: 2d 2d 20 20 20 61 20 7c 20 74 77 6f 20 20 20 7c  --   a | two   |
4d40: 20 20 20 20 20 20 20 31 20 7c 20 20 20 20 20 20         1 |      
4d50: 20 31 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20   1</i>.  <i>--  
4d60: 20 61 20 7c 20 74 68 72 65 65 20 7c 20 20 20 20   a | three |    
4d70: 20 20 20 31 20 7c 20 20 20 20 20 20 20 32 3c 2f     1 |       2</
4d80: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 62 20 7c  i>.  <i>--   b |
4d90: 20 66 6f 75 72 20 20 7c 20 20 20 20 20 20 20 32   four  |       2
4da0: 20 7c 20 20 20 20 20 20 20 32 3c 2f 69 3e 0a 20   |       2</i>. 
4db0: 20 3c 69 3e 2d 2d 20 20 20 63 20 7c 20 66 69 76   <i>--   c | fiv
4dc0: 65 20 20 7c 20 20 20 20 20 20 20 32 20 7c 20 20  e  |       2 |  
4dd0: 20 20 20 20 20 33 3c 2f 69 3e 0a 20 20 3c 69 3e       3</i>.  <i>
4de0: 2d 2d 20 20 20 63 20 7c 20 73 69 78 20 20 20 7c  --   c | six   |
4df0: 20 20 20 20 20 20 20 32 20 7c 20 20 20 20 20 20         2 |      
4e00: 20 34 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 3c   4</i>.  <i>-- <
4e10: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 61 20 20  /i>.  SELECT a  
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 20 20 20 20 20 41 53 20 61 2c 0a 20 20 20 20        AS a,.    
4e40: 20 20 20 20 20 62 20 20 20 20 20 20 20 20 20 20       b          
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 53                AS
4e60: 20 62 2c 0a 20 20 20 20 20 20 20 20 20 6e 74 69   b,.         nti
4e70: 6c 65 28 32 29 20 4f 56 45 52 20 77 69 6e 20 20  le(2) OVER win  
4e80: 20 20 20 20 20 20 41 53 20 6e 74 69 6c 65 5f 32        AS ntile_2
4e90: 2c 0a 20 20 20 20 20 20 20 20 20 6e 74 69 6c 65  ,.         ntile
4ea0: 28 34 29 20 4f 56 45 52 20 77 69 6e 20 20 20 20  (4) OVER win    
4eb0: 20 20 20 20 41 53 20 6e 74 69 6c 65 5f 34 0a 20      AS ntile_4. 
4ec0: 20 46 52 4f 4d 20 74 32 0a 20 20 57 49 4e 44 4f   FROM t2.  WINDO
4ed0: 57 20 77 69 6e 20 41 53 20 28 4f 52 44 45 52 20  W win AS (ORDER 
4ee0: 42 59 20 61 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  BY a);.</codeblo
4ef0: 63 6b 3e 0a 0a 3c 70 3e 20 54 68 65 20 6e 65 78  ck>..<p> The nex
4f00: 74 20 65 78 61 6d 70 6c 65 20 64 65 6d 6f 6e 73  t example demons
4f10: 74 72 61 74 65 73 20 6c 61 67 28 29 2c 20 6c 65  trates lag(), le
4f20: 61 64 28 29 2c 20 66 69 72 73 74 5f 76 61 6c 75  ad(), first_valu
4f30: 65 28 29 2c 20 6c 61 73 74 5f 76 61 6c 75 65 28  e(), last_value(
4f40: 29 0a 61 6e 64 20 6e 74 68 5f 76 61 6c 75 65 28  ).and nth_value(
4f50: 29 2e 20 54 68 65 20 3c 69 3e 26 6c 74 3b 66 72  ). The <i>&lt;fr
4f60: 61 6d 65 2d 73 70 65 63 69 66 69 63 61 74 69 6f  ame-specificatio
4f70: 6e 26 67 74 3b 3c 2f 69 3e 20 69 73 20 69 67 6e  n&gt;</i> is ign
4f80: 6f 72 65 64 20 62 79 20 62 6f 74 68 20 6c 61 67  ored by both lag
4f90: 28 29 20 61 6e 64 20 6c 65 61 64 28 29 2c 20 62  () and lead(), b
4fa0: 75 74 20 72 65 73 70 65 63 74 65 64 20 62 79 20  ut respected by 
4fb0: 66 69 72 73 74 5f 76 61 6c 75 65 28 29 2c 20 6c  first_value(), l
4fc0: 61 73 74 5f 76 61 6c 75 65 28 29 20 61 6e 64 20  ast_value() and 
4fd0: 6e 74 68 5f 76 61 6c 75 65 28 29 2e 0a 0a 3c 63  nth_value()...<c
4fe0: 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d  odeblock>.  <i>-
4ff0: 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  - The following 
5000: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
5010: 20 72 65 74 75 72 6e 73 3a 3c 2f 69 3e 0a 20 20   returns:</i>.  
5020: 3c 69 3e 2d 2d 20 3c 2f 69 3e 0a 20 20 3c 69 3e  <i>-- </i>.  <i>
5030: 2d 2d 20 20 20 62 20 7c 20 6c 65 61 64 20 7c 20  --   b | lead | 
5040: 6c 61 67 20 20 7c 20 66 69 72 73 74 5f 76 61 6c  lag  | first_val
5050: 75 65 20 7c 20 6c 61 73 74 5f 76 61 6c 75 65 20  ue | last_value 
5060: 7c 20 6e 74 68 5f 76 61 6c 75 65 5f 33 3c 2f 69  | nth_value_3</i
5070: 3e 0a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  >.  ------------
5080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50b0: 2d 0a 20 20 3c 69 3e 2d 2d 20 20 20 41 20 7c 20  -.  <i>--   A | 
50c0: 43 20 20 20 20 7c 20 4e 55 4c 4c 20 7c 20 41 20  C    | NULL | A 
50d0: 20 20 20 20 20 20 20 20 20 20 7c 20 41 20 20 20            | A   
50e0: 20 20 20 20 20 20 20 7c 20 4e 55 4c 4c 20 20 20         | NULL   
50f0: 20 20 20 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d      </i>.  <i>--
5100: 20 20 20 42 20 7c 20 44 20 20 20 20 7c 20 41 20     B | D    | A 
5110: 20 20 20 7c 20 41 20 20 20 20 20 20 20 20 20 20     | A          
5120: 20 7c 20 42 20 20 20 20 20 20 20 20 20 20 7c 20   | B          | 
5130: 4e 55 4c 4c 20 20 20 20 20 20 20 3c 2f 69 3e 0a  NULL       </i>.
5140: 20 20 3c 69 3e 2d 2d 20 20 20 43 20 7c 20 45 20    <i>--   C | E 
5150: 20 20 20 7c 20 42 20 20 20 20 7c 20 41 20 20 20     | B    | A   
5160: 20 20 20 20 20 20 20 20 7c 20 43 20 20 20 20 20          | C     
5170: 20 20 20 20 20 7c 20 43 20 20 20 20 20 20 20 20       | C        
5180: 20 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20    </i>.  <i>--  
5190: 20 44 20 7c 20 46 20 20 20 20 7c 20 43 20 20 20   D | F    | C   
51a0: 20 7c 20 41 20 20 20 20 20 20 20 20 20 20 20 7c   | A           |
51b0: 20 44 20 20 20 20 20 20 20 20 20 20 7c 20 43 20   D          | C 
51c0: 20 20 20 20 20 20 20 20 20 3c 2f 69 3e 0a 20 20           </i>.  
51d0: 3c 69 3e 2d 2d 20 20 20 45 20 7c 20 47 20 20 20  <i>--   E | G   
51e0: 20 7c 20 44 20 20 20 20 7c 20 41 20 20 20 20 20   | D    | A     
51f0: 20 20 20 20 20 20 7c 20 45 20 20 20 20 20 20 20        | E       
5200: 20 20 20 7c 20 43 20 20 20 20 20 20 20 20 20 20     | C          
5210: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 46  </i>.  <i>--   F
5220: 20 7c 20 6e 2f 61 20 20 7c 20 45 20 20 20 20 7c   | n/a  | E    |
5230: 20 41 20 20 20 20 20 20 20 20 20 20 20 7c 20 46   A           | F
5240: 20 20 20 20 20 20 20 20 20 20 7c 20 43 20 20 20            | C   
5250: 20 20 20 20 20 20 20 3c 2f 69 3e 0a 20 20 3c 69         </i>.  <i
5260: 3e 2d 2d 20 20 20 47 20 7c 20 6e 2f 61 20 20 7c  >--   G | n/a  |
5270: 20 46 20 20 20 20 7c 20 41 20 20 20 20 20 20 20   F    | A       
5280: 20 20 20 20 7c 20 47 20 20 20 20 20 20 20 20 20      | G         
5290: 20 7c 20 43 20 20 20 20 20 20 20 20 20 20 3c 2f   | C          </
52a0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 3c 2f 69 3e 0a  i>.  <i>-- </i>.
52b0: 20 20 53 45 4c 45 43 54 20 62 20 20 20 20 20 20    SELECT b      
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52d0: 20 20 20 20 41 53 20 62 2c 0a 20 20 20 20 20 20      AS b,.      
52e0: 20 20 20 6c 65 61 64 28 62 2c 20 32 2c 20 27 6e     lead(b, 2, 'n
52f0: 2f 61 27 29 20 4f 56 45 52 20 77 69 6e 20 41 53  /a') OVER win AS
5300: 20 6c 65 61 64 2c 0a 20 20 20 20 20 20 20 20 20   lead,.         
5310: 6c 61 67 28 62 29 20 4f 56 45 52 20 77 69 6e 20  lag(b) OVER win 
5320: 20 20 20 20 20 20 20 20 20 20 20 41 53 20 6c 61             AS la
5330: 67 2c 0a 20 20 20 20 20 20 20 20 20 66 69 72 73  g,.         firs
5340: 74 5f 76 61 6c 75 65 28 62 29 20 4f 56 45 52 20  t_value(b) OVER 
5350: 77 69 6e 20 20 20 20 41 53 20 66 69 72 73 74 5f  win    AS first_
5360: 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20  value,.         
5370: 6c 61 73 74 5f 76 61 6c 75 65 28 62 29 20 4f 56  last_value(b) OV
5380: 45 52 20 77 69 6e 20 20 20 20 20 41 53 20 6c 61  ER win     AS la
5390: 73 74 5f 76 61 6c 75 65 2c 0a 20 20 20 20 20 20  st_value,.      
53a0: 20 20 20 6e 74 68 5f 76 61 6c 75 65 28 62 2c 20     nth_value(b, 
53b0: 33 29 20 4f 56 45 52 20 77 69 6e 20 20 20 41 53  3) OVER win   AS
53c0: 20 6e 74 68 5f 76 61 6c 75 65 5f 33 0a 20 20 46   nth_value_3.  F
53d0: 52 4f 4d 20 74 31 0a 20 20 57 49 4e 44 4f 57 20  ROM t1.  WINDOW 
53e0: 77 69 6e 20 41 53 20 28 4f 52 44 45 52 20 42 59  win AS (ORDER BY
53f0: 20 62 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20   b ROWS BETWEEN 
5400: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
5410: 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ING AND CURRENT 
5420: 52 4f 57 29 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  ROW).</codeblock
5430: 3e 0a 0a 3c 68 31 20 74 61 67 73 3d 22 75 73 65  >..<h1 tags="use
5440: 72 2d 64 65 66 69 6e 65 64 20 77 69 6e 64 6f 77  r-defined window
5450: 20 66 75 6e 63 74 69 6f 6e 73 22 3e 55 73 65 72   functions">User
5460: 2d 44 65 66 69 6e 65 64 20 41 67 67 72 65 67 61  -Defined Aggrega
5470: 74 65 20 57 69 6e 64 6f 77 20 46 75 6e 63 74 69  te Window Functi
5480: 6f 6e 73 3c 2f 68 31 3e 0a 0a 3c 70 3e 20 55 73  ons</h1>..<p> Us
5490: 65 72 2d 64 65 66 69 6e 65 64 20 61 67 67 72 65  er-defined aggre
54a0: 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63  gate window func
54b0: 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 63 72 65  tions may be cre
54c0: 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 0a 5b  ated using the.[
54d0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 77  sqlite3_create_w
54e0: 69 6e 64 6f 77 5f 66 75 6e 63 74 69 6f 6e 5d 28  indow_function](
54f0: 29 20 41 50 49 2e 20 49 6d 70 6c 65 6d 65 6e 74  ) API. Implement
5500: 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65  ing an aggregate
5510: 20 77 69 6e 64 6f 77 0a 66 75 6e 63 74 69 6f 6e   window.function
5520: 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72   is very similar
5530: 20 74 6f 20 61 6e 20 6f 72 64 69 6e 61 72 79 20   to an ordinary 
5540: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
5550: 6f 6e 2e 20 41 6e 79 20 75 73 65 72 2d 64 65 66  on. Any user-def
5560: 69 6e 65 64 0a 61 67 67 72 65 67 61 74 65 20 77  ined.aggregate w
5570: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 6d  indow function m
5580: 61 79 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  ay also be used 
5590: 61 73 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 61  as an ordinary a
55a0: 67 67 72 65 67 61 74 65 2e 20 54 6f 20 0a 69 6d  ggregate. To .im
55b0: 70 6c 65 6d 65 6e 74 20 61 20 75 73 65 72 2d 64  plement a user-d
55c0: 65 66 69 6e 65 64 20 61 67 67 72 65 67 61 74 65  efined aggregate
55d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
55e0: 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
55f0: 20 6d 75 73 74 0a 73 75 70 70 6c 79 20 66 6f 75   must.supply fou
5600: 72 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  r callback funct
5610: 69 6f 6e 73 3a 0a 0a 3c 74 61 62 6c 65 20 73 74  ions:..<table st
5620: 72 69 70 65 64 3d 31 3e 0a 3c 74 72 3e 3c 74 68  riped=1>.<tr><th
5630: 3e 43 61 6c 6c 62 61 63 6b 20 3c 74 68 3e 44 65  >Callback <th>De
5640: 73 63 72 69 70 74 69 6f 6e 0a 3c 74 72 3e 3c 74  scription.<tr><t
5650: 64 3e 78 53 74 65 70 20 3c 74 64 3e 0a 20 20 20  d>xStep <td>.   
5660: 20 20 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69     This method i
5670: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 62 6f  s required by bo
5680: 74 68 20 77 69 6e 64 6f 77 20 61 67 67 72 65 67  th window aggreg
5690: 61 74 65 20 61 6e 64 20 6c 65 67 61 63 79 20 61  ate and legacy a
56a0: 67 67 72 65 67 61 74 65 0a 20 20 20 20 20 20 66  ggregate.      f
56b0: 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  unction implemen
56c0: 74 61 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 69  tations. It is i
56d0: 6e 76 6f 6b 65 64 20 74 6f 20 61 64 64 20 61 20  nvoked to add a 
56e0: 72 6f 77 20 74 6f 20 74 68 65 20 63 75 72 72 65  row to the curre
56f0: 6e 74 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 2e  nt.      window.
5700: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 72   The function ar
5710: 67 75 6d 65 6e 74 73 2c 20 69 66 20 61 6e 79 2c  guments, if any,
5720: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
5730: 6f 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 0a  o the row being.
5740: 20 20 20 20 20 20 61 64 64 65 64 20 61 72 65 20        added are 
5750: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 69 6d  passed to the im
5760: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
5770: 78 53 74 65 70 2e 0a 0a 3c 74 72 3e 3c 74 64 3e  xStep...<tr><td>
5780: 78 46 69 6e 61 6c 20 3c 74 64 3e 0a 20 20 20 20  xFinal <td>.    
5790: 20 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69 73    This method is
57a0: 20 72 65 71 75 69 72 65 64 20 62 79 20 62 6f 74   required by bot
57b0: 68 20 77 69 6e 64 6f 77 20 61 67 67 72 65 67 61  h window aggrega
57c0: 74 65 20 61 6e 64 20 6c 65 67 61 63 79 20 61 67  te and legacy ag
57d0: 67 72 65 67 61 74 65 0a 20 20 20 20 20 20 66 75  gregate.      fu
57e0: 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  nction implement
57f0: 61 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 69 6e  ations. It is in
5800: 76 6f 6b 65 64 20 74 6f 20 72 65 74 75 72 6e 20  voked to return 
5810: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
5820: 65 0a 20 20 20 20 20 20 6f 66 20 74 68 65 20 61  e.      of the a
5830: 67 67 72 65 67 61 74 65 20 28 64 65 74 65 72 6d  ggregate (determ
5840: 69 6e 65 64 20 62 79 20 74 68 65 20 63 6f 6e 74  ined by the cont
5850: 65 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72 72  ents of the curr
5860: 65 6e 74 20 77 69 6e 64 6f 77 29 2c 0a 20 20 20  ent window),.   
5870: 20 20 20 61 6e 64 20 74 6f 20 66 72 65 65 20 61     and to free a
5880: 6e 79 20 72 65 73 6f 75 72 63 65 73 20 61 6c 6c  ny resources all
5890: 6f 63 61 74 65 64 20 62 79 20 65 61 72 6c 69 65  ocated by earlie
58a0: 72 20 63 61 6c 6c 73 20 74 6f 20 78 53 74 65 70  r calls to xStep
58b0: 2e 0a 0a 3c 74 72 3e 3c 74 64 3e 78 56 61 6c 75  ...<tr><td>xValu
58c0: 65 20 3c 74 64 3e 0a 20 20 20 20 20 20 54 68 69  e <td>.      Thi
58d0: 73 20 6d 65 74 68 6f 64 20 69 73 20 6f 6e 6c 79  s method is only
58e0: 20 72 65 71 75 69 72 65 64 20 77 69 6e 64 6f 77   required window
58f0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
5900: 69 6f 6e 73 2c 20 6e 6f 74 20 6c 65 67 61 63 79  ions, not legacy
5910: 0a 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65  .      aggregate
5920: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
5930: 65 6e 74 61 74 69 6f 6e 73 2e 20 49 74 20 69 73  entations. It is
5940: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 74 75   invoked to retu
5950: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  rn the current. 
5960: 20 20 20 20 20 76 61 6c 75 65 20 6f 66 20 74 68       value of th
5970: 65 20 61 67 67 72 65 67 61 74 65 2e 20 55 6e 6c  e aggregate. Unl
5980: 69 6b 65 20 78 46 69 6e 61 6c 2c 20 74 68 65 20  ike xFinal, the 
5990: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 73  implementation s
59a0: 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 20 20 20 20  hould not.      
59b0: 64 65 6c 65 74 65 20 61 6e 79 20 63 6f 6e 74 65  delete any conte
59c0: 78 74 2e 0a 0a 3c 74 72 3e 3c 74 64 3e 78 49 6e  xt...<tr><td>xIn
59d0: 76 65 72 73 65 20 3c 74 64 3e 0a 20 20 20 20 20  verse <td>.     
59e0: 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20   This method is 
59f0: 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 77 69  only required wi
5a00: 6e 64 6f 77 20 61 67 67 72 65 67 61 74 65 20 66  ndow aggregate f
5a10: 75 6e 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 6c 65  unctions, not le
5a20: 67 61 63 79 0a 20 20 20 20 20 20 61 67 67 72 65  gacy.      aggre
5a30: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 6d  gate function im
5a40: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 20 49  plementations. I
5a50: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  t is invoked to 
5a60: 72 65 6d 6f 76 65 20 61 20 72 6f 77 0a 20 20 20  remove a row.   
5a70: 20 20 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72     from the curr
5a80: 65 6e 74 20 77 69 6e 64 6f 77 2e 20 54 68 65 20  ent window. The 
5a90: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
5aa0: 74 73 2c 20 69 66 20 61 6e 79 2c 20 63 6f 72 72  ts, if any, corr
5ab0: 65 73 70 6f 6e 64 0a 20 20 20 20 20 20 74 6f 20  espond.      to 
5ac0: 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 72 65  the row being re
5ad0: 6d 6f 76 65 64 2e 0a 3c 2f 74 61 62 6c 65 3e 0a  moved..</table>.
5ae0: 0a 3c 70 3e 20 54 68 65 20 43 20 63 6f 64 65 20  .<p> The C code 
5af0: 62 65 6c 6f 77 20 69 6d 70 6c 65 6d 65 6e 74 73  below implements
5b00: 20 61 20 73 69 6d 70 6c 65 20 77 69 6e 64 6f 77   a simple window
5b10: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
5b20: 69 6f 6e 20 6e 61 6d 65 64 0a 73 75 6d 69 6e 74  ion named.sumint
5b30: 28 29 2e 20 54 68 69 73 20 77 6f 72 6b 73 20 69  (). This works i
5b40: 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61  n the same way a
5b50: 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 73  s the built-in s
5b60: 75 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20 65  um() function, e
5b70: 78 63 65 70 74 0a 74 68 61 74 20 69 74 20 74 68  xcept.that it th
5b80: 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f  rows an exceptio
5b90: 6e 20 69 66 20 70 61 73 73 65 64 20 61 6e 20 61  n if passed an a
5ba0: 72 67 75 6d 65 6e 74 20 74 68 61 74 20 69 73 20  rgument that is 
5bb0: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 0a 76  not an integer.v
5bc0: 61 6c 75 65 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63  alue...<codebloc
5bd0: 6b 3e 0a 3c 74 63 6c 3e 0a 0a 70 72 6f 63 20 43  k>.<tcl>..proc C
5be0: 5f 43 6f 64 65 20 7b 74 65 78 74 7d 20 7b 0a 20  _Code {text} {. 
5bf0: 20 68 64 5f 70 75 74 73 20 22 3c 70 72 65 3e 5c   hd_puts "<pre>\
5c00: 6e 22 0a 20 20 73 65 74 20 69 4c 69 6e 65 20 30  n".  set iLine 0
5c10: 0a 20 20 66 6f 72 65 61 63 68 20 7a 4c 69 6e 65  .  foreach zLine
5c20: 20 5b 73 70 6c 69 74 20 5b 73 74 72 69 6e 67 20   [split [string 
5c30: 74 72 69 6d 20 24 74 65 78 74 20 22 5c 6e 22 5d  trim $text "\n"]
5c40: 20 22 5c 6e 22 5d 20 7b 0a 20 20 20 20 72 65 67   "\n"] {.    reg
5c50: 73 75 62 20 7b 5e 20 20 7d 20 24 7a 4c 69 6e 65  sub {^  } $zLine
5c60: 20 7b 7d 20 7a 4c 69 6e 65 20 0a 20 20 20 20 73   {} zLine .    s
5c70: 65 74 20 7a 53 75 62 73 70 65 63 20 7b 3c 69 3e  et zSubspec {<i>
5c80: 26 3c 2f 69 3e 7d 0a 20 20 20 20 72 65 67 73 75  &</i>}.    regsu
5c90: 62 20 7b 28 2f 5c 2a 7c 5c 2a 5c 2a 7c 5c 2a 2f  b {(/\*|\*\*|\*/
5ca0: 29 2e 2a 7d 20 24 7a 4c 69 6e 65 20 24 7a 53 75  ).*} $zLine $zSu
5cb0: 62 73 70 65 63 20 7a 4c 69 6e 65 20 0a 20 20 20  bspec zLine .   
5cc0: 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 28 2e   if {[regexp {(.
5cd0: 2a 29 28 73 71 6c 69 74 65 33 5b 61 2d 7a 30 2d  *)(sqlite3[a-z0-
5ce0: 39 5f 5d 2a 29 28 2e 2a 29 7d 20 24 7a 4c 69 6e  9_]*)(.*)} $zLin
5cf0: 65 20 2d 3e 20 6f 6e 65 20 74 77 6f 20 74 68 72  e -> one two thr
5d00: 65 65 5d 7d 20 7b 0a 20 20 20 20 20 20 68 64 5f  ee]} {.      hd_
5d10: 70 75 74 73 20 24 6f 6e 65 0a 20 20 20 20 20 20  puts $one.      
5d20: 68 64 5f 72 65 73 6f 6c 76 65 20 22 5c 5b 24 74  hd_resolve "\[$t
5d30: 77 6f 5c 5d 22 0a 20 20 20 20 20 20 68 64 5f 70  wo\]".      hd_p
5d40: 75 74 73 20 24 74 68 72 65 65 0a 20 20 20 20 7d  uts $three.    }
5d50: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 68 64   else {.      hd
5d60: 5f 70 75 74 73 20 24 7a 4c 69 6e 65 0a 20 20 20  _puts $zLine.   
5d70: 20 7d 0a 20 20 20 20 68 64 5f 70 75 74 73 20 22   }.    hd_puts "
5d80: 5c 6e 22 0a 20 20 7d 0a 20 20 68 64 5f 70 75 74  \n".  }.  hd_put
5d90: 73 20 22 3c 2f 70 72 65 3e 5c 6e 22 0a 7d 0a 0a  s "</pre>\n".}..
5da0: 43 5f 43 6f 64 65 20 7b 0a 20 20 2f 2a 0a 20 20  C_Code {.  /*.  
5db0: 2a 2a 20 78 53 74 65 70 20 66 6f 72 20 73 75 6d  ** xStep for sum
5dc0: 69 6e 74 28 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  int()..  **.  **
5dd0: 20 41 64 64 20 74 68 65 20 76 61 6c 75 65 20 6f   Add the value o
5de0: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
5df0: 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
5e00: 63 6f 6e 74 65 78 74 20 28 61 6e 20 69 6e 74 65  context (an inte
5e10: 67 65 72 29 2e 0a 20 20 2a 2f 0a 20 20 73 74 61  ger)..  */.  sta
5e20: 74 69 63 20 76 6f 69 64 20 73 75 6d 69 6e 74 53  tic void sumintS
5e30: 74 65 70 28 0a 20 20 20 20 73 71 6c 69 74 65 33  tep(.    sqlite3
5e40: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a  _context *ctx, .
5e50: 20 20 20 20 69 6e 74 20 6e 41 72 67 2c 20 0a 20      int nArg, . 
5e60: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
5e70: 20 2a 61 70 41 72 67 5b 5d 0a 20 20 29 7b 0a 20   *apArg[].  ){. 
5e80: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
5e90: 20 2a 70 49 6e 74 3b 0a 20 20 0a 20 20 20 20 61   *pInt;.  .    a
5ea0: 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29  ssert( nArg==1 )
5eb0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
5ec0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 41  3_value_type(apA
5ed0: 72 67 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 49  rg[0])!=SQLITE_I
5ee0: 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
5ef0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
5f00: 72 72 6f 72 28 63 74 78 2c 20 22 69 6e 76 61 6c  rror(ctx, "inval
5f10: 69 64 20 61 72 67 75 6d 65 6e 74 22 2c 20 2d 31  id argument", -1
5f20: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
5f30: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 74 20  .    }.    pInt 
5f40: 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  = (sqlite3_int64
5f50: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
5f60: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 74 78 2c  ate_context(ctx,
5f70: 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
5f80: 69 6e 74 36 34 29 29 3b 0a 20 20 20 20 69 66 28  int64));.    if(
5f90: 20 70 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 2a   pInt ){.      *
5fa0: 70 49 6e 74 20 2b 3d 20 73 71 6c 69 74 65 33 5f  pInt += sqlite3_
5fb0: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72  value_int64(apAr
5fc0: 67 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  g[0]);.    }.  }
5fd0: 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 78 49  .  .  /*.  ** xI
5fe0: 6e 76 65 72 73 65 20 66 6f 72 20 73 75 6d 69 6e  nverse for sumin
5ff0: 74 28 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  t()..  **.  ** T
6000: 68 69 73 20 64 6f 65 73 20 74 68 65 20 6f 70 70  his does the opp
6010: 6f 73 69 74 65 20 6f 66 20 78 53 74 65 70 28 29  osite of xStep()
6020: 20 2d 20 73 75 62 74 72 61 63 74 73 20 74 68 65   - subtracts the
6030: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 72   value of the ar
6040: 67 75 6d 65 6e 74 0a 20 20 2a 2a 20 66 72 6f 6d  gument.  ** from
6050: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
6060: 74 65 78 74 20 76 61 6c 75 65 2e 20 54 68 65 20  text value. The 
6070: 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 63  error checking c
6080: 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 66 72  an be omitted fr
6090: 6f 6d 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  om.  ** this fun
60a0: 63 74 69 6f 6e 2c 20 61 73 20 69 74 20 69 73 20  ction, as it is 
60b0: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
60c0: 20 61 66 74 65 72 20 78 53 74 65 70 28 29 20 28   after xStep() (
60d0: 73 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65  so the aggregate
60e0: 0a 20 20 2a 2a 20 63 6f 6e 74 65 78 74 20 68 61  .  ** context ha
60f0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
6100: 6c 6c 6f 63 61 74 65 64 29 20 61 6e 64 20 77 69  llocated) and wi
6110: 74 68 20 61 20 76 61 6c 75 65 20 74 68 61 74 20  th a value that 
6120: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
6130: 20 62 65 65 6e 20 70 61 73 73 65 64 20 74 6f 20   been passed to 
6140: 78 53 74 65 70 28 29 20 77 69 74 68 6f 75 74 20  xStep() without 
6150: 65 72 72 6f 72 20 28 73 6f 20 69 74 20 6d 75 73  error (so it mus
6160: 74 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 29  t be an integer)
6170: 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ..  */.  static 
6180: 76 6f 69 64 20 73 75 6d 69 6e 74 49 6e 76 65 72  void sumintInver
6190: 73 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se(.    sqlite3_
61a0: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a 20  context *ctx, . 
61b0: 20 20 20 69 6e 74 20 6e 41 72 67 2c 20 0a 20 20     int nArg, .  
61c0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
61d0: 2a 61 70 41 72 67 5b 5d 0a 20 20 29 7b 0a 20 20  *apArg[].  ){.  
61e0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
61f0: 2a 70 49 6e 74 3b 0a 20 20 20 20 61 73 73 65 72  *pInt;.    asser
6200: 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t( sqlite3_value
6210: 5f 74 79 70 65 28 61 70 41 72 67 5b 30 5d 29 3d  _type(apArg[0])=
6220: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
6230: 29 3b 0a 20 20 20 20 70 49 6e 74 20 3d 20 28 73  );.    pInt = (s
6240: 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 73 71  qlite3_int64*)sq
6250: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
6260: 63 6f 6e 74 65 78 74 28 63 74 78 2c 20 73 69 7a  context(ctx, siz
6270: 65 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  eof(sqlite3_int6
6280: 34 29 29 3b 0a 20 20 20 20 2a 70 49 6e 74 20 2d  4));.    *pInt -
6290: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
62a0: 69 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29 3b  int64(apArg[0]);
62b0: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
62c0: 2a 20 78 46 69 6e 61 6c 20 66 6f 72 20 73 75 6d  * xFinal for sum
62d0: 69 6e 74 28 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  int()..  **.  **
62e0: 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
62f0: 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ent value of the
6300: 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64 6f   aggregate windo
6310: 77 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61  w function. Beca
6320: 75 73 65 0a 20 20 2a 2a 20 74 68 69 73 20 69 6d  use.  ** this im
6330: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
6340: 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61  s not allocate a
6350: 6e 79 20 72 65 73 6f 75 72 63 65 73 20 62 65 79  ny resources bey
6360: 6f 6e 64 20 74 68 65 20 62 75 66 66 65 72 0a 20  ond the buffer. 
6370: 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20   ** returned by 
6380: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
6390: 65 5f 63 6f 6e 74 65 78 74 2c 20 77 68 69 63 68  e_context, which
63a0: 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
63b0: 79 20 66 72 65 65 64 0a 20 20 2a 2a 20 62 79 20  y freed.  ** by 
63c0: 74 68 65 20 73 79 73 74 65 6d 2c 20 74 68 65 72  the system, ther
63d0: 65 20 61 72 65 20 6e 6f 20 72 65 73 6f 75 72 63  e are no resourc
63e0: 65 73 20 74 6f 20 66 72 65 65 2e 20 41 6e 64 20  es to free. And 
63f0: 73 6f 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69  so this method i
6400: 73 0a 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c  s.  ** identical
6410: 20 74 6f 20 78 56 61 6c 75 65 28 29 2e 0a 20 20   to xValue()..  
6420: 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
6430: 20 73 75 6d 69 6e 74 46 69 6e 61 6c 28 73 71 6c   sumintFinal(sql
6440: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
6450: 78 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  x){.    sqlite3_
6460: 69 6e 74 36 34 20 72 65 73 20 3d 20 30 3b 0a 20  int64 res = 0;. 
6470: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
6480: 20 2a 70 49 6e 74 3b 0a 20 20 20 20 70 49 6e 74   *pInt;.    pInt
6490: 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   = (sqlite3_int6
64a0: 34 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  4*)sqlite3_aggre
64b0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 74 78  gate_context(ctx
64c0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49  , 0);.    if( pI
64d0: 6e 74 20 29 20 72 65 73 20 3d 20 2a 70 49 6e 74  nt ) res = *pInt
64e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
64f0: 73 75 6c 74 5f 69 6e 74 36 34 28 63 74 78 2c 20  sult_int64(ctx, 
6500: 72 65 73 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  res);.  }.  .  /
6510: 2a 0a 20 20 2a 2a 20 78 56 61 6c 75 65 20 66 6f  *.  ** xValue fo
6520: 72 20 73 75 6d 69 6e 74 28 29 2e 0a 20 20 2a 2a  r sumint()..  **
6530: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
6540: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
6550: 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
6560: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2e  window function.
6570: 20 42 65 63 61 75 73 65 0a 20 20 2a 2f 0a 20 20   Because.  */.  
6580: 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 69  static void sumi
6590: 6e 74 56 61 6c 75 65 28 73 71 6c 69 74 65 33 5f  ntValue(sqlite3_
65a0: 63 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20  context *ctx){. 
65b0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
65c0: 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 73 71   res = 0;.    sq
65d0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 49 6e  lite3_int64 *pIn
65e0: 74 3b 0a 20 20 20 20 70 49 6e 74 20 3d 20 28 73  t;.    pInt = (s
65f0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 73 71  qlite3_int64*)sq
6600: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
6610: 63 6f 6e 74 65 78 74 28 63 74 78 2c 20 30 29 3b  context(ctx, 0);
6620: 0a 20 20 20 20 69 66 28 20 70 49 6e 74 20 29 20  .    if( pInt ) 
6630: 72 65 73 20 3d 20 2a 70 49 6e 74 3b 0a 20 20 20  res = *pInt;.   
6640: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6650: 69 6e 74 36 34 28 63 74 78 2c 20 72 65 73 29 3b  int64(ctx, res);
6660: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
6670: 52 65 67 69 73 74 65 72 20 73 75 6d 69 6e 74 28  Register sumint(
6680: 29 20 77 69 6e 64 6f 77 20 61 67 67 72 65 67 61  ) window aggrega
6690: 74 65 20 77 69 74 68 20 64 61 74 61 62 61 73 65  te with database
66a0: 20 68 61 6e 64 6c 65 20 64 62 2e 20 0a 20 20 2a   handle db. .  *
66b0: 2f 0a 20 20 69 6e 74 20 72 65 67 69 73 74 65 72  /.  int register
66c0: 5f 73 75 6d 69 6e 74 28 73 71 6c 69 74 65 33 20  _sumint(sqlite3 
66d0: 2a 64 62 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  *db){.    return
66e0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
66f0: 77 69 6e 64 6f 77 5f 66 75 6e 63 74 69 6f 6e 28  window_function(
6700: 64 62 2c 20 22 73 75 6d 69 6e 74 22 2c 20 31 2c  db, "sumint", 1,
6710: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
6720: 0a 20 20 20 20 20 20 20 20 73 75 6d 69 6e 74 53  .        sumintS
6730: 74 65 70 2c 20 73 75 6d 69 6e 74 46 69 6e 61 6c  tep, sumintFinal
6740: 2c 20 73 75 6d 69 6e 74 56 61 6c 75 65 2c 20 73  , sumintValue, s
6750: 75 6d 69 6e 74 49 6e 76 65 72 73 65 2c 20 30 0a  umintInverse, 0.
6760: 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 3c 2f 74      );.  }.}.</t
6770: 63 6c 3e 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  cl>.</codeblock>
6780: 0a 0a 3c 70 3e 20 54 68 65 20 66 6f 6c 6c 6f 77  ..<p> The follow
6790: 69 6e 67 20 65 78 61 6d 70 6c 65 20 75 73 65 73  ing example uses
67a0: 20 74 68 65 20 73 75 6d 69 6e 74 28 29 20 66 75   the sumint() fu
67b0: 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  nction implement
67c0: 65 64 20 62 79 20 74 68 65 20 61 62 6f 76 65 0a  ed by the above.
67d0: 43 20 63 6f 64 65 2e 20 46 6f 72 20 65 61 63 68  C code. For each
67e0: 20 72 6f 77 2c 20 74 68 65 20 77 69 6e 64 6f 77   row, the window
67f0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
6800: 20 70 72 65 63 65 64 69 6e 67 20 72 6f 77 20 28   preceding row (
6810: 69 66 20 61 6e 79 29 2c 20 74 68 65 20 63 75 72  if any), the cur
6820: 72 65 6e 74 20 72 6f 77 20 61 6e 64 20 74 68 65  rent row and the
6830: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 77 20 28   following row (
6840: 61 67 61 69 6e 2c 20 69 66 20 61 6e 79 29 3a 0a  again, if any):.
6850: 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 43  .<codeblock>.  C
6860: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 78  REATE TABLE t3(x
6870: 2c 20 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , y);.  INSERT I
6880: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27 61  NTO t3 VALUES('a
6890: 27 2c 20 34 29 2c 0a 20 20 20 20 20 20 20 20 20  ', 4),.         
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 27                ('
68b0: 62 27 2c 20 35 29 2c 0a 20 20 20 20 20 20 20 20  b', 5),.        
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
68d0: 27 63 27 2c 20 33 29 2c 0a 20 20 20 20 20 20 20  'c', 3),.       
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68f0: 28 27 64 27 2c 20 38 29 2c 0a 20 20 20 20 20 20  ('d', 8),.      
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6910: 20 28 27 65 27 2c 20 31 29 3b 0a 0a 20 20 3c 69   ('e', 1);..  <i
6920: 3e 2d 2d 20 41 73 73 75 6d 69 6e 67 20 74 68 65  >-- Assuming the
6930: 20 64 61 74 61 62 61 73 65 20 69 73 20 70 6f 70   database is pop
6940: 75 6c 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  ulated using the
6950: 20 61 62 6f 76 65 20 73 63 72 69 70 74 2c 20 74   above script, t
6960: 68 65 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  he </i>.  <i>-- 
6970: 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54  following SELECT
6980: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
6990: 6e 73 3a 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  ns:</i>.  <i>-- 
69a0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 78  </i>.  <i>--   x
69b0: 20 7c 20 73 75 6d 5f 79 3c 2f 69 3e 0a 20 20 2d   | sum_y</i>.  -
69c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20  -------------.  
69d0: 3c 69 3e 2d 2d 20 20 20 61 20 7c 20 39 20 20 20  <i>--   a | 9   
69e0: 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20   </i>.  <i>--   
69f0: 62 20 7c 20 31 32 20 20 20 3c 2f 69 3e 0a 20 20  b | 12   </i>.  
6a00: 3c 69 3e 2d 2d 20 20 20 63 20 7c 20 31 36 20 20  <i>--   c | 16  
6a10: 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20   </i>.  <i>--   
6a20: 64 20 7c 20 31 32 20 20 20 3c 2f 69 3e 0a 20 20  d | 12   </i>.  
6a30: 3c 69 3e 2d 2d 20 20 20 65 20 7c 20 39 20 20 20  <i>--   e | 9   
6a40: 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 3c 2f   </i>.  <i>-- </
6a50: 69 3e 0a 20 20 53 45 4c 45 43 54 20 78 2c 20 73  i>.  SELECT x, s
6a60: 75 6d 69 6e 74 28 79 29 20 4f 56 45 52 20 28 0a  umint(y) OVER (.
6a70: 20 20 20 20 4f 52 44 45 52 20 42 59 20 78 20 52      ORDER BY x R
6a80: 4f 57 53 20 42 45 54 57 45 45 4e 20 31 20 50 52  OWS BETWEEN 1 PR
6a90: 45 43 45 44 49 4e 47 20 41 4e 44 20 31 20 46 4f  ECEDING AND 1 FO
6aa0: 4c 4c 4f 57 49 4e 47 0a 20 20 29 20 41 53 20 73  LLOWING.  ) AS s
6ab0: 75 6d 5f 79 0a 20 20 46 52 4f 4d 20 74 33 20 4f  um_y.  FROM t3 O
6ac0: 52 44 45 52 20 42 59 20 78 3b 0a 3c 2f 63 6f 64  RDER BY x;.</cod
6ad0: 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 49 6e 20 70  eblock>..<p>In p
6ae0: 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 71 75  rocessing the qu
6af0: 65 72 79 20 61 62 6f 76 65 2c 20 53 51 4c 69 74  ery above, SQLit
6b00: 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 73 75  e invokes the su
6b10: 6d 69 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 61  mint callbacks a
6b20: 73 0a 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 70 3e 0a  s.follows:..<p>.
6b30: 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 3c 62 3e 78  <ol>.  <li> <b>x
6b40: 53 74 65 70 28 34 29 3c 2f 62 3e 20 2d 20 61 64  Step(4)</b> - ad
6b50: 64 20 22 34 22 20 74 6f 20 74 68 65 20 63 75 72  d "4" to the cur
6b60: 72 65 6e 74 20 77 69 6e 64 6f 77 2e 0a 20 20 3c  rent window..  <
6b70: 6c 69 3e 20 3c 62 3e 78 53 74 65 70 28 35 29 3c  li> <b>xStep(5)<
6b80: 2f 62 3e 20 2d 20 61 64 64 20 22 35 22 20 74 6f  /b> - add "5" to
6b90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 69 6e   the current win
6ba0: 64 6f 77 2e 0a 20 20 3c 6c 69 3e 20 3c 62 3e 78  dow..  <li> <b>x
6bb0: 56 61 6c 75 65 28 29 3c 2f 62 3e 20 2d 20 69 6e  Value()</b> - in
6bc0: 76 6f 6b 65 20 78 56 61 6c 75 65 28 29 20 74 6f  voke xValue() to
6bd0: 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
6be0: 65 20 6f 66 20 73 75 6d 69 6e 74 28 29 20 66 6f  e of sumint() fo
6bf0: 72 0a 20 20 20 20 20 20 20 74 68 65 20 72 6f 77  r.       the row
6c00: 20 77 69 74 68 20 28 78 3d 27 61 27 29 2e 20 54   with (x='a'). T
6c10: 68 65 20 77 69 6e 64 6f 77 20 63 75 72 72 65 6e  he window curren
6c20: 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  tly consists of 
6c30: 76 61 6c 75 65 73 20 34 20 61 6e 64 20 35 2c 20  values 4 and 5, 
6c40: 0a 20 20 20 20 20 20 20 61 6e 64 20 73 6f 20 74  .       and so t
6c50: 68 65 20 72 65 73 75 6c 74 20 69 73 20 39 2e 0a  he result is 9..
6c60: 20 20 3c 6c 69 3e 20 3c 62 3e 78 53 74 65 70 28    <li> <b>xStep(
6c70: 33 29 3c 2f 62 3e 20 2d 20 61 64 64 20 22 33 22  3)</b> - add "3"
6c80: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
6c90: 77 69 6e 64 6f 77 2e 0a 20 20 3c 6c 69 3e 20 3c  window..  <li> <
6ca0: 62 3e 78 56 61 6c 75 65 28 29 3c 2f 62 3e 20 2d  b>xValue()</b> -
6cb0: 20 69 6e 76 6f 6b 65 20 78 56 61 6c 75 65 28 29   invoke xValue()
6cc0: 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76   to obtain the v
6cd0: 61 6c 75 65 20 6f 66 20 73 75 6d 69 6e 74 28 29  alue of sumint()
6ce0: 20 66 6f 72 0a 20 20 20 20 20 20 20 74 68 65 20   for.       the 
6cf0: 72 6f 77 20 77 69 74 68 20 28 78 3d 27 62 27 29  row with (x='b')
6d00: 2e 20 54 68 65 20 77 69 6e 64 6f 77 20 63 75 72  . The window cur
6d10: 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
6d20: 6f 66 20 76 61 6c 75 65 73 20 34 2c 20 35 20 61  of values 4, 5 a
6d30: 6e 64 0a 20 20 20 20 20 20 20 33 2c 20 61 6e 64  nd.       3, and
6d40: 20 73 6f 20 74 68 65 20 72 65 73 75 6c 74 20 69   so the result i
6d50: 73 20 31 32 2e 0a 20 20 3c 6c 69 3e 20 3c 62 3e  s 12..  <li> <b>
6d60: 78 49 6e 76 65 72 73 65 28 34 29 3c 2f 62 3e 20  xInverse(4)</b> 
6d70: 2d 20 72 65 6d 6f 76 65 20 22 34 22 20 66 72 6f  - remove "4" fro
6d80: 6d 20 74 68 65 20 77 69 6e 64 6f 77 2e 20 0a 20  m the window. . 
6d90: 20 3c 6c 69 3e 20 3c 62 3e 78 53 74 65 70 28 38   <li> <b>xStep(8
6da0: 29 3c 2f 62 3e 20 2d 20 61 64 64 20 22 38 22 20  )</b> - add "8" 
6db0: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  to the current w
6dc0: 69 6e 64 6f 77 2e 20 54 68 65 20 77 69 6e 64 6f  indow. The windo
6dd0: 77 20 6e 6f 77 20 63 6f 6e 73 69 73 74 73 0a 20  w now consists. 
6de0: 20 20 20 20 20 20 6f 66 20 76 61 6c 75 65 73 20        of values 
6df0: 35 2c 20 33 20 61 6e 64 20 38 2e 0a 20 20 3c 6c  5, 3 and 8..  <l
6e00: 69 3e 20 3c 62 3e 78 56 61 6c 75 65 28 29 3c 2f  i> <b>xValue()</
6e10: 62 3e 20 2d 20 69 6e 76 6f 6b 65 64 20 74 6f 20  b> - invoked to 
6e20: 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65  obtain the value
6e30: 20 66 6f 72 20 74 68 65 20 72 6f 77 20 77 69 74   for the row wit
6e40: 68 20 28 78 3d 27 63 27 29 2e 0a 20 20 20 20 20  h (x='c')..     
6e50: 20 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20    In this case, 
6e60: 31 36 2e 0a 20 20 3c 6c 69 3e 20 3c 62 3e 78 49  16..  <li> <b>xI
6e70: 6e 76 65 72 73 65 28 35 29 3c 2f 62 3e 20 2d 20  nverse(5)</b> - 
6e80: 72 65 6d 6f 76 65 20 76 61 6c 75 65 20 22 35 22  remove value "5"
6e90: 20 66 72 6f 6d 20 74 68 65 20 77 69 6e 64 6f 77   from the window
6ea0: 2e 0a 20 20 3c 6c 69 3e 20 3c 62 3e 78 53 74 65  ..  <li> <b>xSte
6eb0: 70 28 31 29 3c 2f 62 3e 20 2d 20 61 64 64 20 76  p(1)</b> - add v
6ec0: 61 6c 75 65 20 22 31 22 20 74 6f 20 74 68 65 20  alue "1" to the 
6ed0: 77 69 6e 64 6f 77 2e 0a 20 20 3c 6c 69 3e 20 3c  window..  <li> <
6ee0: 62 3e 78 56 61 6c 75 65 28 29 3c 2f 62 3e 20 2d  b>xValue()</b> -
6ef0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 6f 62 74 61   invoked to obta
6f00: 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
6f10: 20 72 6f 77 20 28 78 3d 27 64 27 29 2e 0a 20 20   row (x='d')..  
6f20: 3c 6c 69 3e 20 3c 62 3e 78 49 6e 76 65 72 73 65  <li> <b>xInverse
6f30: 28 33 29 3c 2f 62 3e 20 2d 20 72 65 6d 6f 76 65  (3)</b> - remove
6f40: 20 76 61 6c 75 65 20 22 33 22 20 66 72 6f 6d 20   value "3" from 
6f50: 74 68 65 20 77 69 6e 64 6f 77 2e 20 54 68 65 20  the window. The 
6f60: 77 69 6e 64 6f 77 20 6e 6f 77 0a 20 20 20 20 20  window now.     
6f70: 20 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 75 65    contains value
6f80: 73 20 38 20 61 6e 64 20 31 20 6f 6e 6c 79 2e 0a  s 8 and 1 only..
6f90: 20 20 3c 6c 69 3e 20 3c 62 3e 78 56 61 6c 75 65    <li> <b>xValue
6fa0: 28 29 3c 2f 62 3e 20 2d 20 69 6e 76 6f 6b 65 64  ()</b> - invoked
6fb0: 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76   to obtain the v
6fc0: 61 6c 75 65 20 66 6f 72 20 72 6f 77 20 28 78 3d  alue for row (x=
6fd0: 27 64 27 29 2e 20 39 2e 0a 3c 2f 6f 6c 3e 0a     'd'). 9..</ol>.