ACCESS / SQL: вычисление разницы между строками (не датами) - PullRequest
0 голосов
/ 17 февраля 2011

Я просмотрел вопросы здесь, но не нашел подходящего для моего случая.

Я пытаюсь написать запрос, который выведет разницу между строками

Вот таблица:

ITEM     CYCLES
--------------------
itemA     5
itemA     17
itemA     20  
itemA     22
itemB     26
itemB     30
itemB     37

фактически получается запросом и с порядком (элемент, циклы)

вот что я хотел бы, чтобы запрос дал мне:

itemA 12
itemA 3
itemA 2
itemB 4
itemB 7

Я абсолютно не знаю, как поступить в SQL. Это вообще возможно? или я должен написать функцию?

*****************************EDIT*********************************

Я прошу прощения за отсутствие точности и даже некоторые абсурдные ошибки. Я выскочил и поспешно написал: /
Я анализирую сбои элементов, и мне нужно выводить циклы между отказами.

  • столбец ITEM - это просто идентификатор элемента, а
  • ЦИКЛ - это количество циклов, которое было у элемента при возникновении сбоя.

И на самом деле, глядя на это сегодня, я не понимаю, почему я поместил этот средний столбец (A, B, C ...), которого у меня нет в моей таблице.
И действительно, мне не нужно выводить нулевые значения, но в любом случае их не должно быть. Я попробую предоставленные решения и вернусь; спасибо за ответы!

Ответы [ 4 ]

3 голосов
/ 18 февраля 2011

Вот обновленное решение, основанное на изменениях в вашем вопросе. Обратите внимание, что вам нужно изменить Qry на имя вашего запроса:

SELECT Qry.Item, Qry.Cycles - (SELECT TOP 1 Cycles FROM Qry AS Q 
                               WHERE Qry.Item=Q.Item
                                 AND Q.Cycles < Qry.Cycles 
                               ORDER BY Q.Cycles DESC) AS Diff
FROM Qry
WHERE (SELECT TOP 1 Cycles FROM Qry AS Q 
       WHERE Qry.Item=Q.Item AND Q.Cycles < Qry.Cycles) Is Not Null
ORDER BY Qry.Item, Qry.Cycles;

Это дает следующий вывод:

Item    Diff
itemA   12
itemA    3
itemA    2
itemB    4
itemB    7

Я предполагаю, что 6 в вашем примере вывода был опечаткой, так как 30 - 26 = 4.

1 голос
/ 17 февраля 2011

Если предположить, что наши столбцы названы ItemName, Letter, Num, это может сделать что-то вроде следующего:

SELECT T1.ItemName, T1.Letter
    , T1.Num, [T2].[Num]-Nz([T1].[Num],[T2].[Num]) AS Expr1
FROM Table1 AS T1 
    LEFT JOIN Table1 AS T2 
        ON (T1.ItemName = T2.ItemName 
            And Asc([T1].[Letter]) = Asc([T2].[Letter]) - 1 )
Where  [T2].[Num] <> Nz([T1].[Num],[T2].[Num])

Обратите внимание, что вы не можете создать это, используя сетку QBE. Вам нужно будет создать в коде или в представлении SQL.

1 голос
/ 17 февраля 2011

Как насчет:

SELECT b.Item, b.[No], (
   SELECT Top 1 a.No 
   FROM items a 
   WHERE a.No > b.No  
   ORDER BY a.Item,a.No) AS NextNo, 
[NextNo]-[No] AS Result
FROM items AS b;
0 голосов
/ 17 февраля 2011

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

Col0 Col1  Col2 Col3
1   itemA   A    5
2   itemA   B   17
3   itemA   C   20
4   itemA   D   22
5   itemB   A   26
6   itemB   B   30
7   itemB   C   37

Тогда вы можете использовать следующий запрос:

SELECT Tbl.Col1, Tbl.Col3 - Prev.Col3 AS Diff
FROM Tbl INNER JOIN Tbl AS Prev 
  ON Tbl.Col0 - 1 = Prev.Col0 
 AND Tbl.Col1 = Prev.Col1

Чтобы получить именно то, что вы просили:

Col1    Diff
itemA   12
itemA    3
itemA    2
itemB    4
itemB    7

Вам нужно будет управлять данными Col0, чтобы избежать пробелов (т. Е. Поле Autonumber было бы плохой идеей).

Все вышесказанное было сказано, если вы дадите нам знать, что вы действительно пытаетесь достичь, я думаю, что, вероятно, есть лучший способ сделать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...