Как получить индекс вхождения столбца в запросе? - PullRequest
0 голосов
/ 26 октября 2018

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

| Make        | Model    | Option    | Model Index |
├-------------+----------+-----------+-------------┤
| Lamborghini | Diablo   | SE30 Jota | 1           |
| Lamborghini | Diablo   | SE30      | 1           |
| Lamborghini | Cala     |           | 2           |
| Pontiac     | Trans AM | GTA       | 1           |
| Pontiac     | Trans AM | Firefox   | 1           |
| Pontiac     | GTO      | Judge     | 2           |
| Pontiac     | Fiero    | GT        | 3           |

Обратите внимание, что индекс модели должен повторяться для автомобилей той же марки и модели с другим параметром, но также должен сбрасываться при изменении модели. Мне удалось найти SQL, чтобы выполнить сброс при внесении изменений, но как только я включу столбец параметров, я получу неправильные результаты.

SELECT
    Makes.Name,
    Models.Name,
    Options.Name,
    ROW_NUMBER() OVER (PARTITION BY Makes.Id ORDER BY Models.Name) [Model Index]
FROM 
    Makes
INNER JOIN  
    Models ON Models.MakeId = Makes.Id
INNER JOIN 
    Options ON Options.ModelId = Models.Id

Результат из этого SQL (не желательно):

| Make        | Model    | Option    | Model Index |
├-------------+----------+-----------+-------------┤
| Lamborghini | Diablo   | SE30 Jota | 1           |
| Lamborghini | Diablo   | SE30      | 2           |
| Lamborghini | Cala     |           | 3           |
| Pontiac     | Trans AM | GTA       | 1           |
| Pontiac     | Trans AM | Firefox   | 2           |
| Pontiac     | GTO      | Judge     | 3           |
| Pontiac     | Fiero    | GT        | 4           |

Возможно, я ошибаюсь в том, что я использую ROW_NUMBER в своем запросе, и я не думаю, что номер строки может повторяться в данном разделе. Я думаю, что мне нужен SomethingElse(PerhapsSomeReferenceToModel) OVER (PARTITION BY Makes.Id ORDER BY Models.Name), но я не знаю, каким должен быть SomethingElse(PerhapsSomeReferenceToModel)!

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Для результатов с 1-2-1-2-3 ваш запрос должен быть правильным. Псевдонимы таблиц также упрощают запрос:

SELECT ma.Name, mo.Name, o.Name,
       ROW_NUMBER() OVER (PARTITION BY mo.MakeId ORDER BY o.Name) as [Model Index]
FROM Makes ma INNER JOIN
     Models mo
     ON mo.MakeId = ma.Id INNER JOIN
     Options o
     ON o.ModelId = mo.Id;

Я подозреваю, что вы хотите 1-2-1-2-1. Если это так, вам нужно изменить PARTITION BY:

SELECT ma.Name, mo.Name, o.Name,
       ROW_NUMBER() OVER (PARTITION BY mo.MakeId, mo.ModelId ORDER BY o.Name) as [Model Index]
FROM Makes ma INNER JOIN
     Models mo
     ON mo.MakeId = ma.Id INNER JOIN
     Options o
     ON o.ModelId = mo.Id
0 голосов
/ 26 октября 2018

Позвольте мне перефразировать ваше требование:

  • Модельный индекс сбрасывается при внесении изменений
  • Модельный индекс повторяется для той же модели

Вам нужно RANK() вместо ROW_NUMBER() или DENSE_RANK(), если модельный индекс не может содержать пробелов:

SELECT
    *,
    RANK() OVER (PARTITION BY Make ORDER BY Model) AS [Model Index],
    DENSE_RANK() OVER (PARTITION BY Make ORDER BY Model) AS [Model Index DENSE]
FROM @t
ORDER BY Make, Model

DB Fiddle

(приведенный выше пример разделения и упорядочения по names . На практике вы могли бы сделать что-то вроде PARTITION BY MakeID ORDER BY ModelID).

...