SQL Row_Number () функционирует в операторе Where

введем var для хранения счетчиков

ваш измененный код будет:

tapButton.addTarget(self, action: #selector(singleTap(_:)), for: .touchUpInside)


    private var numberOfTaps = 0
    private var lastTapDate: Date?

    @objc private func singleTap(_ sender: UIButton) {
        if let lastTapDate = lastTapDate, Date().timeIntervalSince(lastTapDate) <= 1 { // less then a second
            numberOfTaps += 1
        } else {
            numberOfTaps = 0
        }

        lastTapDate = Date()

        if numberOfTaps == 3 {
          // do your rewind stuff here 30 sec
          numberOfTaps = 0
        }

    }

редактировать: я не читатель, но я думаю, вы ищете что-то похожее выше код)

85
задан johnnyRose 6 October 2017 в 05:35
поделиться

7 ответов

Я чувствую себя подобно всем ответам, показывающим, что использование CTE или Запроса Sub является достаточными мерами для этого, но я не вижу, что любой добирается до сути того, почему OP имеет проблему. Причина, почему то, какой предложенный OP не работает, происходит из-за логического заказа обработки запроса здесь:

  1. ОТ
  2. НА
  3. СОЕДИНЕНИЕ
  4. , ГДЕ
  5. GROUP BY
  6. С КУБОМ/СВЕРТКОЙ
  7. НАЛИЧИЕ
  8. ВЫБОР
  9. ОТЛИЧНЫЙ
  10. ORDER BY
  11. TOP
  12. СМЕСТИЛ/ВЫБРАЛ

, я полагаю, что это способствует ответу значительно, потому что это объясняет, почему проблемы как этот происходят. WHERE всегда обрабатывается прежде SELECT создание CTE или Запроса Sub, необходимого для многих функций. Вы будете видеть это много в SQL Server.

0
ответ дан 5 November 2019 в 05:56
поделиться

Чтобы обойти эту проблему, оберните оператор выбора в CTE, а затем вы можете запросить CTE и использовать результаты оконной функции в предложении where.

WITH MyCte AS 
(
    select   employee_id,
             RowNum = row_number() OVER ( order by employee_id )
    from     V_EMPLOYEE 
    ORDER BY Employee_ID
)
SELECT  employee_id
FROM    MyCte
WHERE   RowNum > 0
84
ответ дан 5 November 2019 в 05:56
поделиться

Я думаю, вам нужно что-то вроде этого:

SELECT employee_id 
FROM  (SELECT employee_id, row_number() 
       OVER (order by employee_id) AS 'rownumber' 
       FROM V_EMPLOYEE) TableExpressionsMustHaveAnAliasForDumbReasons
WHERE rownumber > 0
19
ответ дан 5 November 2019 в 05:56
поделиться
SELECT  employee_id
FROM    (
        SELECT  employee_id, ROW_NUMBER() OVER (ORDER BY employee_id) AS rn
        FROM    V_EMPLOYEE
        ) q
WHERE   rn > 0
ORDER BY
        Employee_ID

Обратите внимание, что этот фильтр является избыточным: ROW_NUMBER () начинается с 1 и всегда больше 0 .

58
ответ дан 5 November 2019 в 05:56
поделиться

В ответ на комментарии к ответу rexem относительно того, будет ли работать быстрее встроенное представление или CTE, я переделал запросы, чтобы использовать таблицу, которая была доступна у меня и у всех: sys.objects .

WITH object_rows AS (
    SELECT object_id, 
        ROW_NUMBER() OVER ( ORDER BY object_id) RN
    FROM sys.objects)
SELECT object_id
FROM object_rows
WHERE RN > 1

SELECT object_id
FROM (SELECT object_id, 
        ROW_NUMBER() OVER ( ORDER BY object_id) RN
    FROM sys.objects) T
WHERE RN > 1

Созданные планы запросов были точно такими же. Я ожидал, что во всех случаях оптимизатор запросов предложит тот же план, по крайней мере, при простой замене CTE встроенным представлением или наоборот.

Конечно, попробуйте свои собственные запросы в своей собственной системе, чтобы увидеть, есть ли разница.

Кроме того, row_number () в предложении where является распространенной ошибкой в ​​ответах на переполнение стека. Логически row_number () недоступен, пока не будет обработано предложение select. Люди забывают об этом, и когда они отвечают, не проверив ответ, иногда ответ оказывается неверным. (Обвинение, в котором я сам был виновен.

7
ответ дан 5 November 2019 в 05:56
поделиться

на основе OP ' s ответ на вопрос:

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

Запрос с разбивкой на страницы с использованием сортировки по разным столбцам с использованием ROW_NUMBER () OVER () в SQL Server 2005

~ Joseph

«метод 1» похож на запрос OP из связанного вопроса, а «метод» 2 "похож на запрос из выбранного ответа. Вы должны были посмотреть на код, связанный с этим ответом , чтобы увидеть, что на самом деле происходит, поскольку код в выбранном ответе был изменен, чтобы заставить его работать. Попробуйте следующее:

DECLARE @YourTable table (RowID int not null primary key identity, Value1 int, Value2 int, value3 int)
SET NOCOUNT ON
INSERT INTO @YourTable VALUES (1,1,1)
INSERT INTO @YourTable VALUES (1,1,2)
INSERT INTO @YourTable VALUES (1,1,3)
INSERT INTO @YourTable VALUES (1,2,1)
INSERT INTO @YourTable VALUES (1,2,2)
INSERT INTO @YourTable VALUES (1,2,3)
INSERT INTO @YourTable VALUES (1,3,1)
INSERT INTO @YourTable VALUES (1,3,2)
INSERT INTO @YourTable VALUES (1,3,3)
INSERT INTO @YourTable VALUES (2,1,1)
INSERT INTO @YourTable VALUES (2,1,2)
INSERT INTO @YourTable VALUES (2,1,3)
INSERT INTO @YourTable VALUES (2,2,1)
INSERT INTO @YourTable VALUES (2,2,2)
INSERT INTO @YourTable VALUES (2,2,3)
INSERT INTO @YourTable VALUES (2,3,1)
INSERT INTO @YourTable VALUES (2,3,2)
INSERT INTO @YourTable VALUES (2,3,3)
INSERT INTO @YourTable VALUES (3,1,1)
INSERT INTO @YourTable VALUES (3,1,2)
INSERT INTO @YourTable VALUES (3,1,3)
INSERT INTO @YourTable VALUES (3,2,1)
INSERT INTO @YourTable VALUES (3,2,2)
INSERT INTO @YourTable VALUES (3,2,3)
INSERT INTO @YourTable VALUES (3,3,1)
INSERT INTO @YourTable VALUES (3,3,2)
INSERT INTO @YourTable VALUES (3,3,3)
SET NOCOUNT OFF

DECLARE @PageNumber     int
DECLARE @PageSize       int
DECLARE @SortBy         int

SET @PageNumber=3
SET @PageSize=5
SET @SortBy=1


--SELECT * FROM @YourTable

--Method 1
;WITH PaginatedYourTable AS (
SELECT
    RowID,Value1,Value2,Value3
        ,CASE @SortBy
             WHEN  1 THEN ROW_NUMBER() OVER (ORDER BY Value1 ASC)
             WHEN  2 THEN ROW_NUMBER() OVER (ORDER BY Value2 ASC)
             WHEN  3 THEN ROW_NUMBER() OVER (ORDER BY Value3 ASC)
             WHEN -1 THEN ROW_NUMBER() OVER (ORDER BY Value1 DESC)
             WHEN -2 THEN ROW_NUMBER() OVER (ORDER BY Value2 DESC)
             WHEN -3 THEN ROW_NUMBER() OVER (ORDER BY Value3 DESC)
         END AS RowNumber
    FROM @YourTable
    --WHERE
)
SELECT
    RowID,Value1,Value2,Value3,RowNumber
        ,@PageNumber AS PageNumber, @PageSize AS PageSize, @SortBy AS SortBy
    FROM PaginatedYourTable
    WHERE RowNumber>=(@PageNumber-1)*@PageSize AND RowNumber<=(@PageNumber*@PageSize)-1
    ORDER BY RowNumber



--------------------------------------------
--Method 2
;WITH PaginatedYourTable AS (
SELECT
    RowID,Value1,Value2,Value3
        ,ROW_NUMBER() OVER
         (
             ORDER BY
                 CASE @SortBy
                     WHEN  1 THEN Value1
                     WHEN  2 THEN Value2
                     WHEN  3 THEN Value3
                 END ASC
                ,CASE @SortBy
                     WHEN -1 THEN Value1
                     WHEN -2 THEN Value2
                     WHEN -3 THEN Value3
                 END DESC
         ) RowNumber
    FROM @YourTable
    --WHERE  more conditions here
)
SELECT
    RowID,Value1,Value2,Value3,RowNumber
        ,@PageNumber AS PageNumber, @PageSize AS PageSize, @SortBy AS SortBy
    FROM PaginatedYourTable
    WHERE 
        RowNumber>=(@PageNumber-1)*@PageSize AND RowNumber<=(@PageNumber*@PageSize)-1
        --AND more conditions here
    ORDER BY
        CASE @SortBy
            WHEN  1 THEN Value1
            WHEN  2 THEN Value2
            WHEN  3 THEN Value3
        END ASC
       ,CASE @SortBy
            WHEN -1 THEN Value1
            WHEN -2 THEN Value2
            WHEN -3 THEN Value3
        END DESC

ВЫХОД:

RowID  Value1 Value2 Value3 RowNumber  PageNumber  PageSize    SortBy
------ ------ ------ ------ ---------- ----------- ----------- -----------
10     2      1      1      10         3           5           1
11     2      1      2      11         3           5           1
12     2      1      3      12         3           5           1
13     2      2      1      13         3           5           1
14     2      2      2      14         3           5           1

(5 row(s) affected

RowID  Value1 Value2 Value3 RowNumber  PageNumber  PageSize    SortBy
------ ------ ------ ------ ---------- ----------- ----------- -----------
10     2      1      1      10         3           5           1
11     2      1      2      11         3           5           1
12     2      1      3      12         3           5           1
13     2      2      1      13         3           5           1
14     2      2      2      14         3           5           1

(5 row(s) affected)
2
ответ дан 5 November 2019 в 05:56
поделиться

Использование CTE (SQL Server 2005 +):

WITH employee_rows AS (
  SELECT t.employee_id,
         ROW_NUMBER() OVER ( ORDER BY t.employee_id ) 'rownum'
    FROM V_EMPLOYEE t)
SELECT er.employee_id
  FROM employee_rows er
 WHERE er.rownum > 1

Использование встроенного представления / альтернативы, не связанной с CTE:

SELECT er.employee_id
  FROM (SELECT t.employee_id,
               ROW_NUMBER() OVER ( ORDER BY t.employee_id ) 'rownum'
          FROM V_EMPLOYEE t) er
 WHERE er.rownum > 1
4
ответ дан 5 November 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: