window-functions-syntax-table.html 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <!--
  2. To render properly, keep the left-hand alignment.
  3. -->
  4. <table>
  5. <thead>
  6. <tr>
  7. <th></th>
  8. <th>Idiomatic Materialize SQL Pattern</th>
  9. </tr>
  10. </thead>
  11. <tbody>
  12. <tr>
  13. <td>Top-K over partition<br>(K >= 1)</td>
  14. <td class="copyableCode">
  15. ```mzsql
  16. SELECT fieldA, fieldB, ...
  17. FROM (SELECT DISTINCT fieldA FROM tableA) grp,
  18. LATERAL (SELECT fieldB, ... , fieldZ FROM tableA
  19. WHERE fieldA = grp.fieldA
  20. ORDER BY fieldZ ... LIMIT K) -- K is a number >= 1
  21. ORDER BY fieldA, fieldZ ... ;
  22. ```
  23. </td>
  24. </tr>
  25. <tr>
  26. <td>Top-K over partition<br>(K = 1)</td>
  27. <td class="copyableCode">
  28. ```mzsql
  29. SELECT DISTINCT ON(fieldA) fieldA, fieldB, ...
  30. FROM tableA
  31. ORDER BY fieldA, fieldZ ... -- Top-K where K is 1;
  32. ```
  33. </td>
  34. </tr>
  35. <tr>
  36. <td>First value over partition<br>order by ... </td>
  37. <td class="copyableCode">
  38. ```mzsql
  39. SELECT tableA.fieldA, tableA.fieldB, minmax.Z
  40. FROM tableA,
  41. (SELECT fieldA,
  42. MIN(fieldZ) -- Or MAX()
  43. FROM tableA
  44. GROUP BY fieldA) minmax
  45. WHERE tableA.fieldA = minmax.fieldA
  46. ORDER BY fieldA ... ;
  47. ```
  48. </td>
  49. </tr>
  50. <tr>
  51. <td>Last value over partition<br>order by ... <br>range between unbounded preceding<br>and unbounded following</td>
  52. <td class="copyableCode">
  53. ```mzsql
  54. SELECT tableA.fieldA, tableA.fieldB, minmax.Z
  55. FROM tableA,
  56. (SELECT fieldA,
  57. MAX(fieldZ) -- Or MIN()
  58. FROM tableA
  59. GROUP BY fieldA) minmax
  60. WHERE tableA.fieldA = minmax.fieldA
  61. ORDER BY fieldA ... ;
  62. ```
  63. </td>
  64. </tr>
  65. <tr>
  66. <td>
  67. Lag over (order by) whose ordering can be represented by some equality
  68. condition.
  69. </td>
  70. <td class="copyableCode">
  71. ***To exclude the first row since it has no previous row***
  72. ```mzsql
  73. SELECT t1.fieldA, t2.fieldB
  74. FROM tableA t1, tableA t2
  75. WHERE t1.fieldA = t2.fieldA + ...
  76. ORDER BY fieldA;
  77. ```
  78. ***To include the first row***
  79. ```mzsql
  80. SELECT t1.fieldA, t2.fieldB
  81. FROM tableA t1
  82. LEFT JOIN tableA t2
  83. ON t1.fieldA = t2.fieldA + ...
  84. ORDER BY fieldA;
  85. ```
  86. </td>
  87. </tr>
  88. <tr>
  89. <td>
  90. Lead over (order by) whose ordering can be represented by some equality
  91. condition.
  92. </td>
  93. <td class="copyableCode">
  94. ***To exclude the last row since it has no next row***
  95. ```mzsql
  96. SELECT t1.fieldA, t2.fieldB
  97. FROM tableA t1, tableA t2
  98. WHERE t1.fieldA = t2.fieldA - ...
  99. ORDER BY fieldA;
  100. ```
  101. ***To include the last row***
  102. ```mzsql
  103. SELECT t1.fieldA, t2.fieldB
  104. FROM tableA t1
  105. LEFT JOIN tableA t2
  106. ON t1.fieldA = t2.fieldA - ...
  107. ORDER BY fieldA;
  108. ```
  109. </td>
  110. </tr>
  111. </tbody>
  112. </table>