Когда во время учебных занятий по T-SQL мы обсуждаем фильтр TOP и упоминается параметр WITH TIES, я часто вижу удивленные лица слушателей. Очевидно, многим неизвестно о существовании этого параметра и его назначении, хотя он появился в фильтре TOP в версии SQL Server 7.0.

Рассмотрим следующий запрос:

SELECT TOP (3) orderid, orderdate, empid, custid
FROM dbo.Orders
ORDER BY orderdate DESC;

Этот запрос возвращает три последних заказа. Но поскольку столбец orderdate не уникален, нельзя определить предпочтения между строками с одинаковой датой. Из-за этого запрос становится недетерминированным. Порядок доступа к строкам с одинаковой датой определяется порядком физического доступа. Благодаря параметру WITH TIES выполнение запроса не останавливается немедленно после того, как возвращено заданное число строк, а выдаются все связи с последней строкой с учетом элементов упорядочения (в данном случае orderdate). Это означает, что вы можете получить больше строк, чем было запрошено, но отбор строк становится детерминированным.

Применить этот параметр с нашим запросом можно следующим образом:

SELECT TOP (3) WITH TIES orderid, orderdate, empid, custid
FROM dbo.Orders
ORDER BY orderdate DESC;

Теперь, когда мы выяснили возможности параметра WITH TIES, предлагаю вам небольшую задачу. Прежде чем запустить приведенный ниже запрос, попытайтесь ответить, что он делает.

SELECT TOP (1) WITH TIES orderid, orderdate, custid, empid, filler
FROM dbo.Orders
ORDER BY
ROW_NUMBER() OVER(PARTITION BY custid ORDER BY orderdate DESC, orderid DESC);

Выполните следующий программный код, чтобы получить ответ:

SELECT CAST(0x5468652071756572792072657475726E7320746865206D6F737420726563656E74206F7264657220666F72206561636820637573746F6D65722E AS VARCHAR(1000));

Ваш ответ был верным?