Установить значение одной записи в группе на основе условий - SQL Server - PullRequest
0 голосов
/ 08 октября 2019

У меня есть таблица с именем Documents, в которой содержатся URL-адреса документов (чертежей), хранящихся на нашем сервере для каждого элемента в нашей системе.

Существует поле с именем PrintAsThumbnail, которое является полем bit, и оно сообщает системе, помещать ли изображение в какую-либо документацию. У нас может быть несколько документов, хранящихся в одной части. Если отмечен этот PrintAsThumbnail более чем в одном документе, он переходит в расплавленное состояние и ничего не печатается.

То, что я хочу сделать, - это написать скрипт, который помечает ОДИН блок на элемент в соответствии со следующими приоритетами:

  1. Если documentGroupFK = 1, то это тот, который отмечендля элемента независимо.
  2. В противном случае, если URL содержит %.dxf%, то этот флажок
  3. В противном случае, если изображение является файлом изображения (обычно .png или jpgили bmp) тогда любой из них может быть отмечен галочкой
  4. В противном случае, не ставьте галочку, поскольку есть вероятность, остальное будет pdf, и они все равно не будут отображаться.

У меня приблизительно 12900 различных предметов и около 15000 записей.

Я нашел в Google UPDATE или SELECT 1 запись для каждого элемента, и это указало мне на код ниже (credit @gbnна этом сайте) но я изо всех сил пытаюсь адаптировать его, чтобы получить то, что мне нужно.

;WITH cte AS
(
   SELECT *,
         ROW_NUMBER() OVER (PARTITION BY ItemFK ORDER BY DocumentPK DESC) AS rn
   FROM Document where SUM(PrintAsThumbnail) > 1
)
SELECT *
FROM cte
WHERE rn = 1

Я ожидаю, что для каждого элемента (itemFK) будет установлен максимум ОДИН PrintAsThumbnail в соответствии с приведенными выше правилами, поэтому наиболее значимая часть появляется в нашей документации. Я периодически запускаю этот сценарий, чтобы убедиться, что система обновлена.

Пример данных как есть

+--------+-----------------+-------+------------------+
| ItemFK | DocumentGroupFK |  URL  | PrintAsThumbnail |
+--------+-----------------+-------+------------------+
|      1 |               0 | %.dxf |                0 |
|      1 |               0 | %.pdf |                0 |
|      2 |               1 | %.jpg |                1 |
|      2 |               0 | %.pdf |                1 |
|      2 |               0 | %.dxf |                1 |
|      3 |               1 | %.dxf |                0 |
|      3 |               0 | %.pdf |                1 |
|      3 |               0 | %.bmp |                1 |
|        |                 |       |                  |
+--------+-----------------+-------+------------------+

Пример данных после запуска сценария обновления

+--------+-----------------+-------+------------------+
| ItemFK | DocumentGroupFK |  URL  | PrintAsThumbnail |
+--------+-----------------+-------+------------------+
|      1 |               0 | %.dxf |                1 |
|      1 |               0 | %.pdf |                0 |
|      2 |               1 | %.jpg |                1 |
|      2 |               0 | %.pdf |                0 |
|      2 |               0 | %.dxf |                0 |
|      3 |               1 | %.dxf |                1 |
|      3 |               0 | %.pdf |                0 |
|      3 |               0 | %.bmp |                0 |
|        |                 |       |                  |
+--------+-----------------+-------+------------------+

Обратите внимание, что на всех предметах отмечен ОДИН printAsThumbnail. Элемент 1 имеет pdf & .dxf, поэтому правила предписывают ставить отметку .dxf. У элемента 2 есть pdf, изображение и dxf, но правило приоритета 1 состоит в том, что если оно имеет documentGroupFK, равное 1, то это то, что отмечено галочкой. Элемент 3 имеет то же значение, что и 2, но не назначен documentGroupFK, поэтому в правилах указано, что в качестве отмеченного отмечен .dxf

1 Ответ

0 голосов
/ 08 октября 2019

Исходя из вашего описания логики, я ожидаю, что логика будет выглядеть следующим образом:

WITH cte AS (
      SELECT d.*,
             ROW_NUMBER() OVER (PARTITION BY ItemFK 
                                ORDER BY documentGroupFK DESC,
                                         (CASE WHEN url LIKE '%.dxf%' THEN 1
                                               WHEN url LIKE '%.png' OR URL LIKE '%.jpg'
                               ) AS rn
      FROM Document where SUM(PrintAsThumbnail) > 1
     )
UPDATE cte
    SET PrintAsThumbnail = (CASE WHEN seqnum = 1 AND
                                      (documentGroupFK = 1 OR
                                       url LIKE '%.dxf%' OR
                                       url LIKE '%.png%' OR
                                       url LIKE '%.jpg%'
                                      )
                                 THEN 1 ELSE 0
                            END);

Обратите внимание, что это устанавливает оба значения 1 и 0, чтобы гарантировать, что нетдубликаты.

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