Що таке версії SQL Server 2012 для FIRST () та LAST ()?


10

У мене є таблиця з valueстовпчиком. Я хочу обчислити останній ряд мінус перший рядок, як показано тут:

 id      value
  1       10
  2       45
  3       65
  4       95
  .       .
  .       .
  .       .
 500     200

Я хочу отримати 200 - 10 = 190

Я намагався використовувати команду нижче в SQL Server 2012, однак LASTі FIRSTне працює.

SELECT LAST(Value) - FIRST(Value) FROM Counter;

Який синтаксис цієї команди в SQL Server?


@ mohammad2050 - проблема в тому, як визначити рядки "перший" і "останній". Чи є якийсь інший стовпець, який визначає, яким має бути порядок? Наприклад, чи є IDENTITYстовпець чи, можливо, DATETIMEстовпець, який визначає, що таке "перший" та "останній" рядки?
Макс Вернон

1
так, у мене стовпчик ідентифікатора, який триває 1, і це стовпець ІДЕНТИМЕНТІЇ та танки Макс для редагування моєї проблеми
mohammad2050

Відповіді:


21

Ви були поруч - FIRSTі LASTви з Доступу; в SQL Server (починаючи з SQL Server 2012) вони є FIRST_VALUE()і LAST_VALUE().

Отже, якщо ви 2012 року або вище (або база даних Azure SQL), ось один із способів отримати свою відповідь:

CREATE TABLE #fl
(
  IdentityColumn INT IDENTITY, 
  Value INT
);

INSERT #fl(Value) SELECT 10;
INSERT #fl(Value) SELECT 45;
INSERT #fl(Value) SELECT 65;
INSERT #fl(Value) SELECT 95;
INSERT #fl(Value) SELECT 200;

SELECT TOP (1) LAST_VALUE(Value) OVER (ORDER BY IdentityColumn)
            - FIRST_VALUE(Value) OVER (ORDER BY IdentityColumn)
  FROM #fl
  ORDER BY IdentityColumn DESC;

GO
DROP TABLE #fl;

9

Ще один спосіб (який працює і в старих версіях):

SELECT 
    result = (SELECT TOP (1) value FROM counter ORDER BY id DESC)
             - (SELECT TOP (1) value FROM counter ORDER BY id ASC) ;

1

Ось один із способів зробити це:

USE tempdb;

CREATE TABLE dbo.Test1
(
    ID INT NOT NULL
        CONSTRAINT PK_Test1 
        PRIMARY KEY CLUSTERED
        IDENTITY(1,1)
    , Val INT NOT NULL
);
INSERT INTO dbo.Test1 (Val)
VALUES (1)
    , (2)
    , (3)
    , (50);

;WITH FirstAndLast
AS (
    SELECT t.ID
        , t.Val
        , RN  = ROW_NUMBER() OVER (ORDER BY ID)
        , RND = ROW_NUMBER() OVER (ORDER BY ID DESC)
    FROM dbo.Test1 t
)
SELECT TOP(1) l.Val - f.val
FROM FirstAndLast f
    INNER JOIN FirstAndLast l ON f.RN = l.RND

Ідея тут полягає у визначенні рядків "перший" та "останній". Після того, як ви їх визначили, ви можете просто зробити віднімання.


-2

Чому б не використовувати функцію MAX та Min (Необов’язково, якщо у вас використовуються критерії Де)

Напр. Виберіть (Max (NumFieldName) - Min (NumFieldName)) ЯК Висновок ІЗ Таблиці


1
Немає гарантії, що Valueстовпець постійно збільшується. Однак стовпець посвідчення.
RDFozz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.