Как отслеживать итерации значения в SQL - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь отследить использование лезвия в производственном процессе с использованием SSMS 2017. Лезвие загружается и используется на продукте до тех пор, пока оно не станет тусклым, а затем вытащено для заточки, пока другой лезвие не заменит его. У нас есть 30 лезвий, которые зациклены для использования и заточки.

Используя таблицу, в которой указаны номер партии продукта (последовательный) и имя блейда, я бы хотел разделить использование каждой серии имени блейда на группы.

Мои навыки sql довольно просты, поэтому я пробовал row_number, rank и некоторые попытки использования функций опережения и отставания. Пока что это позволило мне разбить каждый продукт по порядку на основе имени блейда и идентифицировать продукт, на котором производится замена блейда. Я чувствую, что это может быть полезно, но мне трудно понять, как именно это сделать.

Я хотел бы иметь возможность присвоить каждой группе изделий, изготовленных с итерацией лезвия, идентификационный номер. Например:

LotNo   BladeID Iteration
418211  BH40    1
418212  BH40    1
418213  BH40    1
418214  ES11    2
418215  ES11    2
418216  BH40    3

В настоящее время я могу выдавать неправильные результаты:

Использование:

SELECT b.LotNo,
       b.BladeID,
       ROW_NUMBER() OVER (PARTITION BY b.BladeID ORDER BY b.BladeID)
FROM blades AS b
ORDER BY b.LotNo ASC;

Я получаю:

LotNo   BladeID Iteration
418211  BH40    1
418212  BH40    2
418213  BH40    3
418214  ES11    1
418215  ES11    2
418216  BH40    4

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

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

CREATE TABLE #Sample(
    LotNo     int,
    BladeID   varchar(10),
    Iteration int
);
INSERT INTO #Sample
VALUES
(418211, 'BH40', 1),
(418212, 'BH40', 1),
(418213, 'BH40', 1),
(418214, 'ES11', 2),
(418215, 'ES11', 2),
(418216, 'BH40', 3);
GO

WITH cteGroups AS(
    SELECT *,
        ROW_NUMBER() OVER(ORDER BY LotNo) - ROW_NUMBER() OVER(PARTITION BY BladeID ORDER BY LotNo) AS island
    FROM #Sample
),
cteOrdering AS(
    SELECT *, MIN( LotNo) OVER( PARTITION BY island, BladeID) AS OrderCol
    FROM cteGroups
)
SELECT LotNo,
    BladeID,
    Iteration,
    DENSE_RANK() OVER( ORDER BY OrderCol) AS IterationCalc
FROM cteOrdering;
0 голосов
/ 29 апреля 2019

Вы можете сделать это с помощью lag() и кумулятивной суммы:

select s.*,
       sum(case when prev_BladeID = BladeId then 0 else 1 end) over (order by LotNo) as Iteration
from (select s.*,
             lag(s.BladeID) over (order by s.LotNo) as prev_BladeID
      from #sample s
     ) s;

В дополнение к тому, что код проще, чем разница номеров строк, я думаю, что это концептуально проще.Это просто подсчет количества раз, которое BladeID изменяется от одного лота к следующему.

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