{"id":94710,"date":"2022-07-04T17:00:53","date_gmt":"2022-07-04T17:00:53","guid":{"rendered":"https:\/\/www.red-gate.com\/simple-talk\/?p=94710"},"modified":"2022-07-01T22:20:18","modified_gmt":"2022-07-01T22:20:18","slug":"whats-new-in-t-sql-in-sql-server-2022","status":"publish","type":"post","link":"https:\/\/www.red-gate.com\/simple-talk\/blogs\/whats-new-in-t-sql-in-sql-server-2022\/","title":{"rendered":"What&#8217;s new in T-SQL in SQL Server 2022"},"content":{"rendered":"<p>There are many new features in <strong>SQL Server 2022<\/strong>. In relation to <strong>T-SQL<\/strong> querying, there are a few as well and they usually are left for last in face of many other new optimization features.<\/p>\n<h2>Sample scenario<\/h2>\n<p>These samples are built on the AdventureWorksDW2019 database installed in a SQL Server 2022 CTP 2.<\/p>\n<h2>Date_Bucket<\/h2>\n<p>Let&#8217;s first consider a sample query. The following query shows information about internet sales and products.<\/p>\n<div><span style=\"font-family: Courier New;font-size: 10pt\"> <span style=\"color: blue\">SELECT<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishproductname<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">orderdate<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">salesamount<\/span> <br \/>\n<span style=\"color: blue\">FROM<\/span>\u00a0\u00a0\u00a0<span style=\"color: maroon\">dimproduct<\/span>\u00a0<span style=\"color: maroon\">p<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">factinternetsales<\/span>\u00a0<span style=\"color: maroon\">fi<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">fi<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span>\u00a0 <\/span><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-94712\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2022\/07\/Image01.png\" alt=\"\" width=\"528\" height=\"272\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>The <strong>Date_Bucket<\/strong> function, as the name implies, calculates date buckets of one specific size. Given a date and the bucket size, the function will return the start date of the bucket containing the date.<\/p>\n<p>This is very useful to classify the facts in our data in groups according a date bucket. For example, we can create 2 weeks bucket, 2 months bucket and so on. The date bucket function is useful for grouping on these scenarios.<\/p>\n<p>For example, based on the query above, let&#8217;s create a 1 week date bucket to group the product sales.<\/p>\n<div><span style=\"font-family: Courier New;font-size: 10pt\"> <span style=\"color: blue\">SELECT<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishproductname<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #ff0080;font-weight: bold\">Date_bucket<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">week<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: black\">1<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">orderdate<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: maroon\">week<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: fuchsia;font-style: italic\">Sum<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">salesamount<\/span><span style=\"color: maroon\">)<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">AS<\/span>\u00a0<span style=\"color: maroon\">SalesTotal<\/span> <br \/>\n<span style=\"color: blue\">FROM<\/span>\u00a0\u00a0\u00a0<span style=\"color: maroon\">dimproduct<\/span>\u00a0<span style=\"color: maroon\">p<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">factinternetsales<\/span>\u00a0<span style=\"color: maroon\">fi<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">fi<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span> <br \/>\n<span style=\"color: blue\">GROUP<\/span>\u00a0\u00a0<span style=\"color: blue\">BY<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishproductname<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #ff0080;font-weight: bold\">Date_bucket<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">week<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: black\">1<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">orderdate<\/span><span style=\"color: maroon\">)<\/span> <br \/>\n<span style=\"color: blue\">ORDER<\/span>\u00a0\u00a0<span style=\"color: blue\">BY<\/span>\u00a0<span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">week<\/span>\u00a0 <\/span><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-94713\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2022\/07\/Image02.png\" alt=\"\" width=\"496\" height=\"280\" \/><\/p>\n<p>If we change the size of the bucket to 2 weeks, instead of one, you may notice on the following image the dates organized for each two weeks.<\/p>\n<p>The calculation of the buckets needs a starting point. This is an optional parameter. When we don&#8217;t specify the starting point, the calculation starts on 01\/01\/1900. That&#8217;s how it was calculates on the previous two queries.<\/p>\n<p>There is no surprise the <strong>Date_Bucket<\/strong> expression is not a <strong>SARG<\/strong>. As you may notice on the execution plan below, the index operations are all <strong>SCAN<\/strong>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-94714\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2022\/07\/Image03.png\" alt=\"\" width=\"1586\" height=\"268\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>The query plan complains about some missing indexes. Let&#8217;s create them first and analyse the impact of <strong>Date_bucket<\/strong> isolated from other needs in the query.<\/p>\n<div><span style=\"font-family: Courier New;font-size: 10pt\"> <span style=\"color: blue\">CREATE<\/span>\u00a0<span style=\"color: blue\">INDEX<\/span>\u00a0<span style=\"color: maroon\">indprodkey<\/span> <br \/>\n\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">dimproduct<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: maroon\">)<\/span> <\/p>\n<p><span style=\"color: blue\">CREATE<\/span>\u00a0<span style=\"color: blue\">INDEX<\/span>\u00a0<span style=\"color: maroon\">indfactprodkey<\/span> <br \/>\n\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">factinternetsales<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: maroon\">)<\/span> <br \/>\n\u00a0\u00a0<span style=\"color: maroon\">include<\/span>\u00a0<span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">orderdate<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">salesamount<\/span><span style=\"color: maroon\">)<\/span>\u00a0 <\/span><\/div>\n<p>After these indexes are created, the query plan will be like this one below:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-94715\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2022\/07\/Image04.png\" alt=\"\" width=\"1146\" height=\"280\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Let&#8217;s execute the follow statements followed by the query execution to get a clean statistics. Don&#8217;t do this in a production environment.<\/p>\n<div><span style=\"font-family: Courier New;font-size: 10pt\"> <span style=\"color: blue\">SET<\/span>\u00a0<span style=\"color: maroon\">statistics<\/span>\u00a0<span style=\"color: maroon\">time<\/span>\u00a0<span style=\"color: blue\">ON<\/span> <br \/>\n<span style=\"color: blue\">SET<\/span>\u00a0<span style=\"color: maroon\">statistics<\/span>\u00a0<span style=\"color: maroon\">io<\/span>\u00a0<span style=\"color: blue\">ON<\/span> <\/p>\n<p><span style=\"color: blue\">DBCC<\/span>\u00a0<span style=\"color: maroon\">freeproccache<\/span> <\/p>\n<p><span style=\"color: blue\">DBCC<\/span>\u00a0<span style=\"color: maroon\">dropcleanbuffers<\/span>\u00a0 <\/span><\/div>\n<h6>SQL Server parse and compile time: <br \/>\nCPU time = 0 ms, elapsed time =<strong> 55 ms<\/strong>.<\/h6>\n<h6>(3959 rows affected)<br \/>\nTable &#8216;Worktable&#8217;. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.<br \/>\nTable &#8216;FactInternetSales&#8217;. <strong>Scan count 1, logical reads 345<\/strong>, physical reads 0, page server reads 0, <strong>read-ahead reads 344<\/strong>, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.<br \/>\nTable &#8216;DimProduct&#8217;. <strong>Scan count 1, logical reads 6, physical reads 1, page server reads 0, read-ahead reads 11<\/strong>, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.<\/h6>\n<h6>SQL Server Execution Times:<br \/>\n<strong>CPU time = 47 ms, elapsed time = 112 ms<\/strong>.<\/h6>\n<p>\nThere are two solutions to improve the performance with the <strong>Date_Bucket<\/strong> function:<\/p>\n<ul>\n<li>If the Buckets match with information in a date dimension, using the date dimension instead of date_bucket will perform better. Leaves the date_bucket function for buckets which don&#8217;t match with information in the date dimension.<\/li>\n<li>If the bucket is used very often, create a calculated field and uses it in an index.<\/li>\n<\/ul>\n<p>Considering the indexes we created before, the code to create and use the calculated field will be like this:<\/p>\n<div><span style=\"font-family: Courier New;font-size: 10pt\"> <span style=\"color: blue\">ALTER<\/span>\u00a0<span style=\"color: blue\">TABLE<\/span>\u00a0<span style=\"color: maroon\">factinternetsales<\/span> <br \/>\n\u00a0\u00a0<span style=\"color: blue\">ADD<\/span>\u00a0<span style=\"color: maroon\">twoweeksbucket<\/span><br \/>\n<span style=\"color: blue\">\u00a0 \u00a0 \u00a0 \u00a0AS<\/span>\u00a0<span style=\"color: #ff0080;font-weight: bold\">Date_bucket<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">week<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: black\">2<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">orderdate<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: maroon\">persisted<\/span> <br \/>\n<span style=\"color: maroon\">go<\/span> <\/p>\n<p><span style=\"color: blue\">DROP<\/span>\u00a0<span style=\"color: blue\">INDEX<\/span>\u00a0<span style=\"color: maroon\">factinternetsales<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">indfactprodkey<\/span><br \/>\n<span style=\"color: maroon\">go<\/span> <\/p>\n<p><span style=\"color: blue\">CREATE<\/span>\u00a0<span style=\"color: blue\">INDEX<\/span>\u00a0<span style=\"color: maroon\">indfactprodkey<\/span> <br \/>\n\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">factinternetsales<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">twoweeksbucket<\/span><span style=\"color: maroon\">)<\/span> <br \/>\n\u00a0\u00a0<span style=\"color: maroon\">include<\/span>\u00a0<span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">salesamount<\/span><span style=\"color: maroon\">)<\/span><br \/>\n<span style=\"color: maroon\">go<\/span>\u00a0 <\/span><\/div>\n<p>\nThe new query will need to use the calculated field. The new query plan changes the location of the stream aggregate and the cost of the <strong>SORT<\/strong> is very reduced. We need to check the statistics and time to compare the new query with the old one.<\/p>\n<div><span style=\"font-family: Courier New;font-size: 10pt\"> <span style=\"color: blue\">SELECT<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishproductname<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">twoweeksbucket<\/span>\u00a0\u00a0\u00a0<span style=\"color: maroon\">week<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: fuchsia;font-style: italic\">Sum<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">salesamount<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: blue\">AS<\/span>\u00a0<span style=\"color: maroon\">SalesTotal<\/span> <br \/>\n<span style=\"color: blue\">FROM<\/span>\u00a0\u00a0\u00a0<span style=\"color: maroon\">dimproduct<\/span>\u00a0<span style=\"color: maroon\">p<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">factinternetsales<\/span>\u00a0<span style=\"color: maroon\">fi<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">fi<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span> <br \/>\n<span style=\"color: blue\">GROUP<\/span>\u00a0\u00a0<span style=\"color: blue\">BY<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishproductname<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">twoweeksbucket<\/span> <br \/>\n<span style=\"color: blue\">ORDER<\/span>\u00a0\u00a0<span style=\"color: blue\">BY<\/span>\u00a0<span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">week<\/span>\u00a0 <\/span><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-94716\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2022\/07\/Image05.png\" alt=\"\" width=\"1194\" height=\"280\" \/><\/p>\n<h6>\nSQL Server parse and compile time: <br \/>\n<strong>CPU time = 31 ms, elapsed time = 64 ms<\/strong>.<\/h6>\n<h6>(3959 rows affected)<br \/>\nTable &#8216;Worktable&#8217;. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.<br \/>\nTable &#8216;FactInternetSales&#8217;. <strong>Scan count 1, logical reads 405<\/strong>, physical reads 0, page server reads 0, <strong>read-ahead reads 409<\/strong>, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.<br \/>\nTable &#8216;DimProduct&#8217;. <strong>Scan count 1, logical reads 6, physical reads 1<\/strong>, page server reads 0, <strong>read-ahead reads 11<\/strong>, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.<\/h6>\n<h6>SQL Server Execution Times:<br \/>\n<strong>CPU time = 15 ms, elapsed time = 68 ms<\/strong>.<\/h6>\n<p>\nThe CPU time and Elapsed Time improved a lot from the original query.<\/p>\n<p>You can read more about <strong>Date_Bucket<\/strong> here<\/p>\n<h2>\nWindow Expression<\/h2>\n<p>The window functions and <strong>OVER<\/strong> expressions are present since <strong>SQL Server 2018<\/strong>. Now we have a new expression to make it easier to write these queries.<\/p>\n<p>The <strong>OVER<\/strong> expression allows us to retrieve detail data about the rows and aggregated data at the same time.<\/p>\n<p>For example, considering the previous example using date_bucket, we can bring the details of each transaction and the total of the week bucket. We also can make a percentage calculation comparing each transaction with the bucket&#8217;s total<\/p>\n<p>The query will be like this:<\/p>\n<div><span style=\"font-family: Courier New;font-size: 10pt\"> <span style=\"color: blue\">SELECT<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishproductname<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">salesamount<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">orderdate<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #ff0080;font-weight: bold\">Date_bucket<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">week<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: black\">1<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">orderdate<\/span><span style=\"color: maroon\">)<\/span> <span style=\"color: maroon\">week<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: fuchsia;font-style: italic\">Sum<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">salesamount<\/span><span style=\"color: maroon\">)<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">OVER<\/span>\u00a0<span style=\"color: maroon\">(<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">partition<\/span>\u00a0<span style=\"color: blue\">BY<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: #ff0080;font-weight: bold\">Date_bucket<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">week<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: black\">1<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">orderdate<\/span><span style=\"color: maroon\">)<\/span><span style=\"color: maroon\">)<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">WeeklyTotal<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: black\">100<\/span>\u00a0<span style=\"color: silver\">*<\/span>\u00a0<span style=\"color: maroon\">salesamount<\/span>\u00a0<span style=\"color: silver\">\/<\/span>\u00a0<span style=\"color: fuchsia;font-style: italic\">Sum<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">salesamount<\/span><span style=\"color: maroon\">)<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">OVER<\/span>\u00a0<span style=\"color: maroon\">(<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">partition<\/span>\u00a0<span style=\"color: blue\">BY<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: #ff0080;font-weight: bold\">Date_bucket<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">week<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: black\">1<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">orderdate<\/span><span style=\"color: maroon\">)<\/span><span style=\"color: maroon\">) <\/span><span style=\"color: maroon\">Percentage<\/span> <br \/>\n<span style=\"color: blue\">FROM<\/span>\u00a0\u00a0\u00a0<span style=\"color: maroon\">dimproduct<\/span>\u00a0<span style=\"color: maroon\">p<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">factinternetsales<\/span>\u00a0<span style=\"color: maroon\">fi<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">fi<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span> <br \/>\n<span style=\"color: blue\">ORDER<\/span>\u00a0\u00a0<span style=\"color: blue\">BY<\/span>\u00a0<span style=\"color: maroon\">week<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">orderdate<\/span>\u00a0 <\/span><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-94717\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2022\/07\/Image06.png\" alt=\"\" width=\"708\" height=\"468\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>The new <strong>WINDOW<\/strong> expression allows us to simplify the query by writing the <strong>WINDOW<\/strong> expression once, in the end of the query, and referencing it where it&#8217;s needed, even more than once.<\/p>\n<p>Using the <strong>WINDOW<\/strong> expression, the query will be like this:<\/p>\n<div><span style=\"font-family: Courier New;font-size: 10pt\"> <span style=\"color: blue\">SELECT<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishproductname<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">salesamount<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">orderdate<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #ff0080\"><b>Date_bucket<\/b><\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">week<\/span><span style=\"color: silver\">,<\/span><span style=\"color: black\">1<\/span><span style=\"color: silver\">,<\/span><span style=\"color: maroon\">orderdate<\/span><span style=\"color: maroon\">)<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">week<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">sum<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">salesamount<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: blue\">OVER<\/span>\u00a0<span style=\"color: maroon\">win<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">weeklytotal<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: black\">100<\/span>\u00a0<span style=\"color: silver\">*<\/span>\u00a0<span style=\"color: maroon\">salesamount<\/span>\u00a0<span style=\"color: silver\">\/<\/span>\u00a0<span style=\"color: maroon\">sum<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">salesamount<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: blue\">OVER<\/span>\u00a0<span style=\"color: maroon\">win<\/span>\u00a0<span style=\"color: maroon\">percentage<\/span> <br \/>\n<span style=\"color: blue\">FROM<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">dimproduct<\/span>\u00a0<span style=\"color: maroon\">p<\/span> <br \/>\n<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">factinternetsales<\/span>\u00a0<span style=\"color: maroon\">fi<\/span> <br \/>\n<span style=\"color: blue\">ON<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">=<\/span><span style=\"color: maroon\">fi<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span>\u00a0<span style=\"color: maroon\">window<\/span>\u00a0<span style=\"color: maroon\">win<\/span>\u00a0<span style=\"color: blue\">AS<\/span>\u00a0<span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">partition<\/span>\u00a0<span style=\"color: blue\">BY<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">date_bucket<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">week<\/span><span style=\"color: silver\">,<\/span><span style=\"color: black\">1<\/span><span style=\"color: silver\">,<\/span><span style=\"color: maroon\">orderdate<\/span><span style=\"color: maroon\">)<\/span><span style=\"color: maroon\">)<\/span> <br \/>\n<span style=\"color: blue\">ORDER<\/span>\u00a0<span style=\"color: blue\">BY<\/span>\u00a0\u00a0\u00a0<span style=\"color: maroon\">week<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">orderdate<\/span> <\/span><\/div>\n<p>&nbsp;<\/p>\n<p>The queries will have the same execution plan, the new syntax will not affect the execution, it will only make them easier to read.<\/p>\n<p>\nYou can read more about the window exprpession here: <a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/t-sql\/queries\/select-window-transact-sql?WT.mc_id=DP-MVP-4014132&amp;view=sql-server-ver16\">https:\/\/docs.microsoft.com\/en-us\/sql\/t-sql\/queries\/select-window-transact-sql?WT.mc_id=DP-MVP-4014132&amp;view=sql-server-ver16<\/a>\u00a0<\/p>\n<h2>LEAST and GREATEST function<\/h2>\n<p>\nThese new functions are used to find the smallest and biggest value in a set of values. They are not intended to be used in a set of records, for this we have the <strong>MAX<\/strong> and <strong>MIN<\/strong> aggregation functions. <strong>LEAST<\/strong> and <strong>GREATEST<\/strong> are intended to be used in a set of values, for example, a set of fields.<\/p>\n<p>Let&#8217;s build one useful example for these functions. We can use the <strong>PIVOT<\/strong> statement in <strong>SQL Server<\/strong> to transform a rows into columns, comparing the sales of the products in a single quarter, for example.<\/p>\n<p>A regular query without using the <strong>PIVOT<\/strong> would be like this:<\/p>\n<div><span style=\"font-family: Courier New;font-size: 10pt\"> <span style=\"color: blue\">SELECT<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishproductname<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishmonthname<\/span>\u00a0<span style=\"color: silver\">+<\/span>\u00a0<span style=\"color: red\">&#8216;\/&#8217;<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: silver\">+<\/span>\u00a0<span style=\"color: fuchsia;font-style: italic\">CONVERT<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: black;font-style: italic\">VARCHAR<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">calendaryear<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: blue\">AS<\/span>\u00a0<span style=\"color: maroon\">Month<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: fuchsia;font-style: italic\">Sum<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">salesamount<\/span><span style=\"color: maroon\">)<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">SalesTotal<\/span> <br \/>\n<span style=\"color: blue\">FROM<\/span>\u00a0\u00a0\u00a0<span style=\"color: maroon\">factinternetsales<\/span>\u00a0<span style=\"color: maroon\">fi<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">dimproduct<\/span>\u00a0<span style=\"color: maroon\">p<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">fi<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">dimdate<\/span>\u00a0<span style=\"color: maroon\">d<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">fi<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">orderdatekey<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">d<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">datekey<\/span> <br \/>\n<span style=\"color: blue\">WHERE<\/span>\u00a0\u00a0<span style=\"color: maroon\">d<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">calendaryear<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: black\">2012<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">AND<\/span>\u00a0<span style=\"color: maroon\">d<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">calendarquarter<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: black\">4<\/span> <br \/>\n<span style=\"color: blue\">GROUP<\/span>\u00a0\u00a0<span style=\"color: blue\">BY<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishproductname<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">calendaryear<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishmonthname<\/span>\u00a0 <\/span><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-94718\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2022\/07\/Image07.png\" alt=\"\" width=\"418\" height=\"404\" \/><\/p>\n<p>\nUsing the <strong>PIVOT<\/strong> on this query we can turn the months into columns:<\/p>\n<div><span style=\"font-family: Courier New;font-size: 10pt\"> <span style=\"color: blue\">SELECT<\/span>\u00a0<span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishproductname<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">[october\/2012]<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">[november\/2012]<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">[december\/2012]<\/span> <br \/>\n<span style=\"color: blue\">FROM<\/span>\u00a0\u00a0\u00a0<span style=\"color: maroon\">(<\/span><span style=\"color: blue\">SELECT<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishproductname<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishmonthname<\/span>\u00a0<span style=\"color: silver\">+<\/span>\u00a0<span style=\"color: red\">&#8216;\/&#8217;<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: silver\">+<\/span>\u00a0<span style=\"color: fuchsia;font-style: italic\">CONVERT<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: black;font-style: italic\">VARCHAR<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">calendaryear<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: blue\">AS<\/span>\u00a0<span style=\"color: maroon\">Month<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: fuchsia;font-style: italic\">Sum<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">salesamount<\/span><span style=\"color: maroon\">)<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">SalesTotal<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">FROM<\/span>\u00a0\u00a0\u00a0<span style=\"color: maroon\">factinternetsales<\/span>\u00a0<span style=\"color: maroon\">fi<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">dimproduct<\/span>\u00a0<span style=\"color: maroon\">p<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">fi<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">dimdate<\/span>\u00a0<span style=\"color: maroon\">d<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">fi<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">orderdatekey<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">d<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">datekey<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">WHERE<\/span>\u00a0\u00a0<span style=\"color: maroon\">d<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">calendaryear<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: black\">2012<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">AND<\/span>\u00a0<span style=\"color: maroon\">d<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">calendarquarter<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: black\">4<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">GROUP<\/span>\u00a0\u00a0<span style=\"color: blue\">BY<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishproductname<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">calendaryear<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishmonthname<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: blue\">AS<\/span>\u00a0<span style=\"color: maroon\">sales<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">PIVOT<\/span>\u00a0<span style=\"color: maroon\">(<\/span>\u00a0<span style=\"color: fuchsia;font-style: italic\">Sum<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">salestotal<\/span><span style=\"color: maroon\">)<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">FOR<\/span>\u00a0<span style=\"color: maroon\">month<\/span>\u00a0<span style=\"color: blue\">IN<\/span>\u00a0<span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">[October\/2012]<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">[November\/2012]<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">[December\/2012]<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: blue\">AS<\/span>\u00a0<span style=\"color: maroon\">pivottable<\/span>\u00a0 <\/span><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-94719\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2022\/07\/Image08.png\" alt=\"\" width=\"522\" height=\"408\" \/><\/p>\n<p>\nThis is a great example to use <strong>LEAST<\/strong> and <strong>GREATEST<\/strong> to find the smallest and biggest values in a quarter:<\/p>\n<div><span style=\"font-family: Courier New;font-size: 10pt\"> <span style=\"color: blue\">SELECT<\/span>\u00a0<span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishproductname<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">[october\/2012]<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">[november\/2012]<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">[december\/2012]<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #ff0080;font-weight: bold\">Least<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">[october\/2012]<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">[november\/2012]<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">[december\/2012]<\/span><span style=\"color: maroon\">)<\/span>\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">smallest<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #ff0080;font-weight: bold\">Greatest<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">[october\/2012]<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">[november\/2012]<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">[december\/2012]<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: maroon\">biggest<\/span> <br \/>\n<span style=\"color: blue\">FROM<\/span>\u00a0\u00a0\u00a0<span style=\"color: maroon\">(<\/span><span style=\"color: blue\">SELECT<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishproductname<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishmonthname<\/span>\u00a0<span style=\"color: silver\">+<\/span>\u00a0<span style=\"color: red\">&#8216;\/&#8217;<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: silver\">+<\/span>\u00a0<span style=\"color: fuchsia;font-style: italic\">CONVERT<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: black;font-style: italic\">VARCHAR<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">calendaryear<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: blue\">AS<\/span>\u00a0<span style=\"color: maroon\">Month<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: fuchsia;font-style: italic\">Sum<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">salesamount<\/span><span style=\"color: maroon\">)<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">SalesTotal<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">FROM<\/span>\u00a0\u00a0\u00a0<span style=\"color: maroon\">factinternetsales<\/span>\u00a0<span style=\"color: maroon\">fi<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">dimproduct<\/span>\u00a0<span style=\"color: maroon\">p<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">fi<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">dimdate<\/span>\u00a0<span style=\"color: maroon\">d<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">fi<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">orderdatekey<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">d<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">datekey<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">WHERE<\/span>\u00a0\u00a0<span style=\"color: maroon\">d<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">calendaryear<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: black\">2012<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">AND<\/span>\u00a0<span style=\"color: maroon\">d<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">calendarquarter<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: black\">4<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">GROUP<\/span>\u00a0\u00a0<span style=\"color: blue\">BY<\/span>\u00a0<span style=\"color: maroon\">p<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">productkey<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishproductname<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">calendaryear<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">englishmonthname<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: blue\">AS<\/span>\u00a0<span style=\"color: maroon\">sales<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">PIVOT<\/span>\u00a0<span style=\"color: maroon\">(<\/span>\u00a0<span style=\"color: fuchsia;font-style: italic\">Sum<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">salestotal<\/span><span style=\"color: maroon\">)<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">FOR<\/span>\u00a0<span style=\"color: maroon\">month<\/span>\u00a0<span style=\"color: blue\">IN<\/span>\u00a0<span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">[October\/2012]<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">[November\/2012]<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">[December\/2012]<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: blue\">AS<\/span>\u00a0<span style=\"color: maroon\">pivottable<\/span>\u00a0 <\/span><\/div>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-94720\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2022\/07\/Image09.png\" alt=\"\" width=\"662\" height=\"400\" \/><\/p>\n<h2>Summary<\/h2>\n<p>These are only 3 of the interesting T-SQL improvements in SQL Server 2022<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>There are many new features in SQL Server 2022. In relation to T-SQL querying, there are a few as well and they usually are left for last in face of many other new optimization features. Sample scenario These samples are built on the AdventureWorksDW2019 database installed in a SQL Server 2022 CTP 2. Date_Bucket Let&#8217;s&#8230;&hellip;<\/p>\n","protected":false},"author":50808,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[2],"tags":[4150,147170,4190],"coauthors":[6810],"class_list":["post-94710","post","type-post","status-publish","format-standard","hentry","category-blogs","tag-sql","tag-sql-server-2022","tag-tsql"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/94710","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/users\/50808"}],"replies":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/comments?post=94710"}],"version-history":[{"count":6,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/94710\/revisions"}],"predecessor-version":[{"id":94725,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/94710\/revisions\/94725"}],"wp:attachment":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/media?parent=94710"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/categories?post=94710"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/tags?post=94710"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/coauthors?post=94710"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}