Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос, похожий на DISTINCT  [new]
Igorgg
Member

Откуда:
Сообщений: 83
Здравствуйте. Помогите сформировать запрос (mssql).Можно с cte.

Есть данные:
UC1 did TripID ObjectID BeginDate parent
39 44060 353 6616 2018-07-15 11:00:28.000 1
39 44071 353 6616 2018-07-15 11:00:28.000 0

...


Надо выбрать так,чтобы если в parent была 1, выбирались записи по 1, 0 не включали,
а если 1 в parent нет, то выбирались по 0.
То есть, как бы аналог DISTINCT, но c полем did.

Спасибо.
17 июл 18, 10:36    [21576946]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ваш то вариант каков ?
17 июл 18, 10:39    [21576954]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
Igorgg
Member

Откуда:
Сообщений: 83
сейчас по cte решаю
17 июл 18, 10:45    [21576979]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
982183
Member

Откуда: VL
Сообщений: 3350
"Выбрать уникальные записи по полю DID
Если parent = 1, то выбрать эту запись
Если не стоит, то выбрать с parent = 0
Так?"

Вопросы:
Какую запись выбрать,
Если есть несколько полей с одинаковым DID и parent = 1
Если есть несколько полей с одинаковым DID и parent = 0 при отсутствии parent = 1 с этим DID
17 июл 18, 10:52    [21576994]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
Igorgg
Member

Откуда:
Сообщений: 83
Да, так.
Если есть несколько полей с одинаковым DID и parent = 1 - выбираем любую одну, но она будет всегда одна.
Если есть несколько полей с одинаковым DID и parent = 0 при отсутствии parent = 1 с этим DID - выбираем любую одну
17 июл 18, 10:55    [21577006]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
row_number() over (partition by did order by parent desc) as RN

where RN = 1
17 июл 18, 10:57    [21577013]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
invm
Member

Откуда: Москва
Сообщений: 9127
Igorgg
Надо выбрать так,чтобы если в parent была 1, выбирались записи по 1, 0 не включали,
а если 1 в parent нет, то выбирались по 0.
row_number() over (partition by UC1, TripID, ObjectID, BeginDate order by parent desc) = 1

В виде запроса оформите самостоятельно.
17 июл 18, 11:02    [21577025]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
Igorgg
Member

Откуда:
Сообщений: 83
Спасибо
17 июл 18, 11:04    [21577038]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
Igorgg
Member

Откуда:
Сообщений: 83
Еще раз спасибо.
C cte все работает.

with cte as (Select *,row_number() over (partition by TripID, ObjectID, BeginDate order by parent desc) as RN from a)
Select * from сte
where RN = 1
order by TripID,ObjectID,BeginDate desc,parent desc

Можно ли этот запрос без cte реализовать?
17 июл 18, 11:41    [21577184]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
londinium
Member

Откуда: Киев
Сообщений: 1139
Igorgg,
можно и без СТЕ

SELECT * FROM
(
  Select *,row_number() over (partition by TripID, ObjectID, BeginDate order by parent desc) as RN from a
)X
WHERE X.RN=1
17 июл 18, 11:46    [21577206]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
invm
Member

Откуда: Москва
Сообщений: 9127
Igorgg
Можно ли этот запрос без cte реализовать?
Аллергия?
CTE это синтаксический сахар для derived table. См. пример И
17 июл 18, 11:47    [21577209]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Igorgg,

cte мешает психологически?

что-то вроде
Select TOP 1 WITH TIES	*
from сte
where RN = 1
order by row_number() over (partition by TripID, ObjectID, BeginDate order by parent desc) as RN from a)
17 июл 18, 11:48    [21577216]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
Igorgg
Member

Откуда:
Сообщений: 83
спасибо
17 июл 18, 11:50    [21577223]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Igorgg
Можно ли этот запрос без cte реализовать?


Select top 1 with ties * 
from a
order by row_number() over (partition by TripID, ObjectID, BeginDate order by parent desc)
17 июл 18, 11:51    [21577226]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
invm
Member

Откуда: Москва
Сообщений: 9127
Minamoto
Select top 1 with ties * 
from a
order by row_number() over (partition by TripID, ObjectID, BeginDate order by parent desc)
Не учите плохому.
17 июл 18, 12:43    [21577377]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7403
Igorgg,

во избежание сортировок при запросе необходимо разделить данные на две таблицы по parent.
17 июл 18, 13:12    [21577456]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
invm, и чего же в этом плохого?
17 июл 18, 15:20    [21578013]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
invm
Member

Откуда: Москва
Сообщений: 9127
Minamoto
invm, и чего же в этом плохого?
Предложенный вами вариант дает в плане выполнения гарантированную неубираемую сортировку по результатам row_number().
17 июл 18, 15:47    [21578163]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
invm,
оффтоп
+
для страху надо
гарантированную неубираемую губительную и беспощадную сортировку
17 июл 18, 16:16    [21578271]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, похожий на DISTINCT  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
invm
Minamoto
invm, и чего же в этом плохого?
Предложенный вами вариант дает в плане выполнения гарантированную неубираемую сортировку по результатам row_number().

Еще одну причину не написали: Он не дает возможности сортировать результат в самом запросе - сортировку можно добавить, только обернув код либо в тот же CTE, либо в подзапрос.
17 июл 18, 17:09    [21578445]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить