Я пытаюсь выбрать один элемент для каждого значения в столбце «Имя» в соответствии с несколькими критериями.
Критерии, которые я хочу использовать, выглядят так:
- Включать только результаты, где IsEnabled = 1
- Вернуть единственный результат с наименьшим приоритетом (мы используем 1 для обозначения «высшего приоритета»)
- В случае ничьей верните результат с новейшей отметкой времени
Я видел несколько других вопросов, которые задают о возврате новейшей временной метки для заданного значения, и я смог адаптировать ее для возврата минимального значения Приоритета - но я не могу понять, как отфильтровать с приоритетом и отметкой времени.
Вот вопрос, который больше всего помог мне в этом.
Пример данных:
+------+------------+-----------+----------+
| Name | Timestamp | IsEnabled | Priority |
+------+------------+-----------+----------+
| A | 2018-01-01 | 1 | 1 |
| A | 2018-03-01 | 1 | 5 |
| B | 2018-01-01 | 1 | 1 |
| B | 2018-03-01 | 0 | 1 |
| C | 2018-01-01 | 1 | 1 |
| C | 2018-03-01 | 1 | 1 |
| C | 2018-05-01 | 0 | 1 |
| C | 2018-06-01 | 1 | 5 |
+------+------------+-----------+----------+
Желаемый вывод:
+------+------------+-----------+----------+
| Name | Timestamp | IsEnabled | Priority |
+------+------------+-----------+----------+
| A | 2018-01-01 | 1 | 1 |
| B | 2018-01-01 | 1 | 1 |
| C | 2018-03-01 | 1 | 1 |
+------+------------+-----------+----------+
То, что я пробовал до сих пор (это дает мне только включенные элементы с самым низким приоритетом, но не фильтрует для самого нового элемента в случае связи):
SELECT DATA.Name, DATA.Timestamp, DATA.IsEnabled, DATA.Priority
From MyData AS DATA
INNER JOIN (
SELECT MIN(Priority) Priority, Name
FROM MyData
GROUP BY Name
) AS Temp ON DATA.Name = Temp.Name AND DATA.Priority = TEMP.Priority
WHERE IsEnabled=1
Вот и SQL-скрипка.
Как улучшить этот запрос, чтобы он возвращал только самый новый результат в дополнение к существующим фильтрам?