powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Специфика порядка вывода строк в запросе
16 сообщений из 16, страница 1 из 1
Специфика порядка вывода строк в запросе
    #40118307
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приветствую, немного наивный вопрос, но кажется, что есть решение. Подскажите как вернуть строки в определенном порядке

Есть такой запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT distinct a.ParamID,b.ParamName,c.BiomaterialTypeName,b.PriorityReport,
					a.ParentParamID,d.ParamName,e.BiomaterialTypeName
				FROM tbParamClientReportParamRecommendedReport a(NOLOCK)
				LEFT JOIN tbParam b(NOLOCK) ON (b.ParamID=a.ParamRecommendedID)
				LEFT JOIN tbBiomaterialType c(NOLOCK) ON (c.BiomaterialType=b.BiomaterialType)	
				LEFT JOIN tbParam d(NOLOCK) ON (d.ParamID=a.ParentParamID)
				LEFT JOIN tbBiomaterialType e(NOLOCK) ON (e.BiomaterialType=d.BiomaterialType)	
				WHERE (a.ReportComplexID = 476) 	
				ORDER BY b.PriorityReport,a.ParentParamID desc,b.ParamName



Нужно вернуть строки в порядке исходя из полей PriorityReport и ParentParamID.

Первым критерием является приоритет.
Но после получения приоритета нужно далее вернуть ВСЕ строки последовательно с таким же ParentParamID даже если у них ниже приоритет. Если заканчиваются все элементы с одним и тем же ParentParamID, то выбираем элемент со следующим по порядку приоритетом. И для него возвращаем все элементы с одинаковым родителем не зависимо от приоритета. И так далее...

Если рассматривать два поля то нужно вернуть так

PriorityReport ParentParamID
100 10
90 10
80 10
1 10
99 112
85 112
72 112
80 null
...



Можно ли этот запрос как то переписать, чтобы выборка была так, как я показал?
...
Рейтинг: 0 / 0
Специфика порядка вывода строк в запросе
    #40118313
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Challenger,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
declare @t table (priorityReport int, parentParamID int);
insert into @t values 
(1, 10),
(72, 112),
(80, 10),
(80, null),
(85, 112),
(90, 10),
(99, 112),
(100, 10),
--
(88, 60),
(15, 60),
(30, 60),
(15, 50),
(15, 28),
(14, 28),
(1, 1);

with x as (
    select max([priorityReport]) as [priority], [parentParamID] from @t group by [parentParamID]
)
select isnull(t.[priorityReport], x.[priority]) as [priorityReport],
       x.[parentParamID]
from x 
    left join @t t on t.[parentParamID] = x.[parentParamID]
order by [priority] desc, t.[priorityReport] desc
...
Рейтинг: 0 / 0
Специфика порядка вывода строк в запросе
    #40118314
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Challenger,

вариант №2:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
declare @t table (priorityReport int, parentParamID int);
insert into @t values 
(1, 10),
(72, 112),
(80, 10),
(80, null),
(85, 112),
(90, 10),
(99, 112),
(100, 10),
--
(88, 60),
(15, 60),
(30, 60),
(15, 50),
(15, 28),
(14, 28),
(1, 1);

with x as (
    select 
          max([priorityReport]) over (partition by [parentParamID]) as [priority],
          [priorityReport],
          [parentParamID]
    from @t
)
select
      [priorityReport],
      [parentParamID]
from x 
order by dense_rank() over (order by [priority] desc), [priorityReport] desc, [parentParamID] desc;
...
Рейтинг: 0 / 0
Специфика порядка вывода строк в запросе
    #40118359
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Challenger,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare @t table (PriorityReport  int not null, ParentParamID int null)
insert @t values
(100, 10),
(99, 112),
(90, 10),
(85, 112),
(80, 10),
(1, 10),
(72, 112),
(80, null)

select * from @t order by isnull(ParentParamID, 1000000000), PriorityReport DESC
...
Рейтинг: 0 / 0
Специфика порядка вывода строк в запросе
    #40118385
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

Первые два запроса не работают правильно. А ваш почти правильно. Спасибо большое за подсказку
Я переписал первичный запрос так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT a.ParamRecommendedID,b.ParamName,c.BiomaterialTypeName,b.PriorityReport,
					a.ParentParamID,d.ParamName,e.BiomaterialTypeName
				FROM tbParamClientReportParamRecommendedReport a(NOLOCK)
				LEFT JOIN tbParam b(NOLOCK) ON (b.ParamID=a.ParamRecommendedID)
				LEFT JOIN tbBiomaterialType c(NOLOCK) ON (c.BiomaterialType=b.BiomaterialType)	
				LEFT JOIN tbParam d(NOLOCK) ON (d.ParamID=a.ParentParamID)
				LEFT JOIN tbBiomaterialType e(NOLOCK) ON (e.BiomaterialType=d.BiomaterialType)	
				WHERE (a.ReportComplexID = 476) --AND (a.ParamClientID = 3918)		
				ORDER BY isnull(ParentParamID, 1000000000), PriorityReport DESC



Выводит так в реальной ситуации, привожу ниже
Не понимаю до конца как это работает и почему приоритет 576 вылез вверх, хотя 576 меньше чем 910

ParamRecommendedID PriorityReport ParentParamID
689 576 82
120 910 94
114 895 94
102 874 94
103 777 94
99 758 94
97 757 94
110 756 94
98 755 94
128 733 94
127 732 94
129 731 94
124 700 94
123 699 94
100 689 94
101 688 94
113 584 94
117 564 94
116 536 94
112 532 94
111 499 94
76 351 94
93 350 94
115 304 94
720 340 182
714 339 182
745 323 182
719 320 182
713 319 182
718 318 182
712 317 182
717 114 182
711 113 182
716 112 182
710 111 182
181 36 182
1121 300 212
209 144 212
214 143 212
208 142 212
347 787 337
354 528 337
338 480 337
350 471 337
342 359 337
343 313 337
434 178 460
433 177 460
656 908 643
661 878 643
655 529 643
667 813 664
666 577 664
665 463 664
151 665 685
150 664 685
148 663 685
149 552 685
156 338 686
170 35 687
624 896 NULL
1099 723 NULL
621 720 NULL
136 648 NULL
752 636 NULL
134 631 NULL
620 614 NULL
1098 593 NULL
1097 592 NULL
1096 591 NULL
1095 590 NULL
619 585 NULL
623 565 NULL
1094 555 NULL
1093 554 NULL
622 537 NULL
650 533 NULL
141 475 NULL
648 472 NULL
1074 448 NULL
642 447 NULL
1092 387 NULL
1091 386 NULL
1090 376 NULL
1069 371 NULL
1075 370 NULL
632 369 NULL
635 368 NULL
1076 367 NULL
634 366 NULL
633 365 NULL
1070 364 NULL
1078 363 NULL
636 362 NULL
288 358 NULL
1089 333 NULL
625 305 NULL
1103 300 NULL
1115 300 NULL
1116 300 NULL
1104 300 NULL
1105 300 NULL
1106 300 NULL
1118 300 NULL
1117 300 NULL
1107 300 NULL
1108 300 NULL
1110 300 NULL
1109 300 NULL
1120 300 NULL
1119 300 NULL
1111 300 NULL
1112 300 NULL
1114 300 NULL
1113 300 NULL
1124 300 NULL
414 233 NULL
416 232 NULL
417 230 NULL
418 229 NULL
373 227 NULL
378 226 NULL
377 225 NULL
369 224 NULL
368 223 NULL
374 222 NULL
366 221 NULL
370 219 NULL
365 218 NULL
376 213 NULL
259 210 NULL
267 209 NULL
263 208 NULL
260 207 NULL
258 206 NULL
257 205 NULL
256 204 NULL
255 203 NULL
249 200 NULL
248 199 NULL
270 198 NULL
266 195 NULL
253 194 NULL
265 193 NULL
264 192 NULL
268 191 NULL
261 190 NULL
269 189 NULL
254 188 NULL
442 186 NULL
441 185 NULL
440 184 NULL
439 183 NULL
438 182 NULL
432 181 NULL
436 179 NULL
237 176 NULL
437 175 NULL
430 174 NULL
431 173 NULL
429 172 NULL
428 171 NULL
235 170 NULL
233 169 NULL
232 168 NULL
329 167 NULL
330 166 NULL
322 165 NULL
327 164 NULL
331 163 NULL
332 162 NULL
324 161 NULL
334 157 NULL
333 156 NULL
335 155 NULL
336 154 NULL
325 153 NULL
306 151 NULL
309 149 NULL
304 148 NULL
311 140 NULL
301 139 NULL
302 138 NULL
291 136 NULL
292 135 NULL
294 134 NULL
297 133 NULL
293 132 NULL
295 131 NULL
296 130 NULL
299 129 NULL
298 128 NULL
290 127 NULL
314 126 NULL
289 125 NULL
300 124 NULL
319 123 NULL
315 121 NULL
316 120 NULL
313 119 NULL
287 118 NULL
286 117 NULL
283 115 NULL
282 114 NULL
284 113 NULL
281 112 NULL
280 111 NULL
272 110 NULL
285 109 NULL
275 108 NULL
273 107 NULL
274 106 NULL
278 105 NULL
277 104 NULL
276 103 NULL
271 102 NULL
690 101 NULL
194 101 NULL
193 100 NULL
192 99 NULL
191 98 NULL
243 97 NULL
242 96 NULL
1088 95 NULL
241 95 NULL
1087 94 NULL
231 94 NULL
234 92 NULL
247 91 NULL
238 90 NULL
321 89 NULL
240 88 NULL
239 87 NULL
244 85 NULL
236 83 NULL
230 81 NULL
228 79 NULL
222 78 NULL
221 76 NULL
375 75 NULL
630 74 NULL
629 73 NULL
372 72 NULL
318 71 NULL
227 70 NULL
226 69 NULL
225 68 NULL
224 67 NULL
218 66 NULL
216 65 NULL
220 64 NULL
219 63 NULL
217 62 NULL
367 61 NULL
628 60 NULL
205 59 NULL
207 58 NULL
206 57 NULL
202 56 NULL
204 55 NULL
203 54 NULL
201 53 NULL
200 52 NULL
199 51 NULL
198 50 NULL
197 49 NULL
196 48 NULL
195 47 NULL
187 46 NULL
1071 45 NULL
188 45 NULL
637 44 NULL
186 44 NULL
638 43 NULL
189 43 NULL
639 42 NULL
190 42 NULL
1072 41 NULL
185 41 NULL
184 40 NULL
180 37 NULL
168 34 NULL
172 33 NULL
167 30 NULL
166 29 NULL
179 28 NULL
1086 27 NULL
751 27 NULL
173 26 NULL
175 23 NULL
174 22 NULL
161 21 NULL
165 20 NULL
163 19 NULL
162 14 NULL
147 13 NULL
152 12 NULL
154 11 NULL
159 9 NULL
157 7 NULL
155 5 NULL
153 4 NULL


Модератор: Убирайте подобные портянки в спойлер
...
Рейтинг: 0 / 0
Специфика порядка вывода строк в запросе
    #40118418
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Challenger,

что значит работают не правильно?

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

сортировка по isnull(ParentParamID, 1000000000), PriorityReport DESC
будет работать по другому: возьмется строка с наименьшим parentParamID, и потом выведется в порядке убывания приоритета.

поскольку у вас в таблице ParentParamID = 82 наименьший он и выводит ее первую вне зависимости от ее приоритета.
...
Рейтинг: 0 / 0
Специфика порядка вывода строк в запросе
    #40118448
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
Challenger,

что значит работают не правильно?

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

сортировка по isnull(ParentParamID, 1000000000), PriorityReport DESC
будет работать по другому: возьмется строка с наименьшим parentParamID, и потом выведется в порядке убывания приоритета.

поскольку у вас в таблице ParentParamID = 82 наименьший он и выводит ее первую вне зависимости от ее приоритета.


Еще раз перепроверю сейчас.

В любом случае спасибо, что подсказываете.
...
Рейтинг: 0 / 0
Специфика порядка вывода строк в запросе
    #40118486
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Challenger,

ничего не знаю, по Вашему письму мой вариант дает 100% совпадение результата.
...
Рейтинг: 0 / 0
Специфика порядка вывода строк в запросе
    #40118493
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff, ваш вариант все таки получилось докрутить, вы не учли, что приоритет и родитель в разных таблицах.

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with x as (
    select MAX(b.PriorityReport) as [priority], a.ParentParamID 
			from tbParamClientReportParamRecommendedReport a(nolock) 
			left join tbParam b(nolock) ON (b.ParamID = a.ParamRecommendedID)
			where  (ReportComplexID = 476) 
			group by a.ParentParamID
)
select t.ParamRecommendedID,e.ParamName,isnull(e.[priorityReport], x.[priority]) as [PriorityReport],
       x.[ParentParamID],
			 t.ParentParamID,g.ParamName,h.BiomaterialTypeName
from x 
    left join tbParamClientReportParamRecommendedReport t on  (ReportComplexID = 476) AND (t.[ParentParamID] = x.[ParentParamID]) --OR (t.ParentParamID IS NULL)
		left join tbParam e on (e.ParamID = t.ParamRecommendedID)
		LEFT JOIN tbBiomaterialType f(NOLOCK) ON (f.BiomaterialType=e.BiomaterialType)	
		LEFT JOIN tbParam g(NOLOCK) ON (g.ParamID=t.ParentParamID)
		LEFT JOIN tbBiomaterialType h(NOLOCK) ON (h.BiomaterialType=g.BiomaterialType)	
order by [Priority] desc, e.[PriorityReport] desc
...
Рейтинг: 0 / 0
Специфика порядка вывода строк в запросе
    #40118499
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Challenger,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
with x as (
     SELECT a.ParamRecommendedID,b.ParamName,c.BiomaterialTypeName,b.PriorityReport, a.ParentParamID,d.ParamName,e.BiomaterialTypeName
     FROM tbParamClientReportParamRecommendedReport a(NOLOCK)
         LEFT JOIN tbParam b(NOLOCK) ON (b.ParamID=a.ParamRecommendedID)
         LEFT JOIN tbBiomaterialType c(NOLOCK) ON (c.BiomaterialType=b.BiomaterialType)	
         LEFT JOIN tbParam d(NOLOCK) ON (d.ParamID=a.ParentParamID)
         LEFT JOIN tbBiomaterialType e(NOLOCK) ON (e.BiomaterialType=d.BiomaterialType)	
     WHERE (a.ReportComplexID = 476) --AND (a.ParamClientID = 3918) 
), y as (
    select 
          max([priorityReport]) over (partition by [parentParamID]) as [priority],
          [priorityReport],
          [parentParamID],
          [ParamRecommendedID],
          [ParamName],
          [BiomaterialTypeName]
    from x
)
select 
      [priorityReport],
      [parentParamID],
      [ParamRecommendedID],
      [ParamName],
      [BiomaterialTypeName]
from y
order by dense_rank() over (order by [priority] desc), [priorityReport] desc, [parentParamID] desc;
...
Рейтинг: 0 / 0
Специфика порядка вывода строк в запросе
    #40118502
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,
а последним запросом что вы показали?

Он кстати с ошибкой выполняется
Сообщение 8156, уровень 16, состояние 1, строка 1
Столбец "ParamName" для "x" указан более одного раза.
...
Рейтинг: 0 / 0
Специфика порядка вывода строк в запросе
    #40118504
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Challenger,

ну подредактируйте там я не стал вдаваться в подробности что вы там у себя за код нарисовали, у вас в селекте колонка ParamName выводится несколько раз

Код: sql
1.
SELECT a.ParamRecommendedID,b.ParamName,c.BiomaterialTypeName,b.PriorityReport, a.ParentParamID,d.ParamName,e.BiomaterialTypeName



перепишите мой на
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
with x as (
     SELECT a.ParamRecommendedID,b.ParamName as [ParamName1],c.BiomaterialTypeName,b.PriorityReport, a.ParentParamID,d.ParamName  as [ParamName2],e.BiomaterialTypeName
     FROM tbParamClientReportParamRecommendedReport a(NOLOCK)
         LEFT JOIN tbParam b(NOLOCK) ON (b.ParamID=a.ParamRecommendedID)
         LEFT JOIN tbBiomaterialType c(NOLOCK) ON (c.BiomaterialType=b.BiomaterialType)	
         LEFT JOIN tbParam d(NOLOCK) ON (d.ParamID=a.ParentParamID)
         LEFT JOIN tbBiomaterialType e(NOLOCK) ON (e.BiomaterialType=d.BiomaterialType)	
     WHERE (a.ReportComplexID = 476) --AND (a.ParamClientID = 3918) 
), y as (
    select 
          max([priorityReport]) over (partition by [parentParamID]) as [priority],
          [priorityReport],
          [parentParamID],
          [ParamRecommendedID],
          [ParamName1],
          [ParamName2],
          [BiomaterialTypeName]
    from x
)
select 
      [priorityReport],
      [parentParamID],
      [ParamRecommendedID],
      [ParamName1],
      [ParamName2],
      [BiomaterialTypeName]
from y
order by dense_rank() over (order by [priority] desc), [priorityReport] desc, [parentParamID] desc;




ps: включайте немного голову, я надеюсь вы не просто копипастом занимаетесь а пытаетесь разобраться в коде что вам дают.
иначе можете столкнуться с ситуацией когда какой нибудь шутник вам напишет в самом начале drop database к примеру, а вы безоглядки код запустите.
...
Рейтинг: 0 / 0
Специфика порядка вывода строк в запросе
    #40118520
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff, конечно, без включения головы ни один из запросов через копи-пэйст не работает.

На я не понимаю зачем последний ваш запрос? Он явно не решает проблему вернуть аналиты с parentParamID = NULL

А без этого условия я уже написал работающий вариант на базе вашего предложения и показал выше.
...
Рейтинг: 0 / 0
Специфика порядка вывода строк в запросе
    #40118533
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Challenger,

вы что то в формулировке задаче поменяли
На я не понимаю зачем последний ваш запрос? Он явно не решает проблему вернуть аналиты с parentParamID = NULL

А без этого условия я уже написал работающий вариант на базе вашего предложения и показал выше.


поясните какого результата вы хотите добиться если parentParamID = NULL

лучше всего на примере, что сейчас вам выдает мой последний запрос и что в нем вас не устраивает, и как вы хотите что бы было.
...
Рейтинг: 0 / 0
Специфика порядка вывода строк в запросе
    #40118537
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

Финальный запрос я поправил, он получился такой, привожу ниже. Вроде работает как нужно. Спасибо большое за помощь и подсказки.

Если родителя нет, то такие элементы тоже нужно показать в порядке приоритета между элементами с родителями, не прерывая всю связку по родителю.

Пример.
PriorityReport ParentParamID
100 10
90 10
80 10
1 10
99 112
85 112
72 112
92 null
90 null
85 77
2 77
84 null

80 null




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with x as (
    select MAX(b.PriorityReport) as [priority], a.ParentParamID 
			from tbParamClientReportParamRecommendedReport a(nolock) 
			left join tbParam b(nolock) ON (b.ParamID = a.ParamRecommendedID)
			where  (ReportComplexID = 476) 
			group by a.ParentParamID
)
select t.ParamRecommendedID,e.ParamName,isnull(e.[priorityReport], x.[priority]) as [PriorityReport],
       
			 t.ParentParamID,g.ParamName,h.BiomaterialTypeName
from x 
    left join tbParamClientReportParamRecommendedReport t on  (ReportComplexID = 476) AND ((t.[ParentParamID] = x.[ParentParamID]) OR ((t.ParentParamID IS NULL) AND (x.ParentParamID IS NULL)))
		left join tbParam e on (e.ParamID = t.ParamRecommendedID)
		LEFT JOIN tbBiomaterialType f(NOLOCK) ON (f.BiomaterialType=e.BiomaterialType)	
		LEFT JOIN tbParam g(NOLOCK) ON (g.ParamID=t.ParentParamID)
		LEFT JOIN tbBiomaterialType h(NOLOCK) ON (h.BiomaterialType=g.BiomaterialType)	
order by [Priority] desc, e.[PriorityReport] desc
...
Рейтинг: 0 / 0
Специфика порядка вывода строк в запросе
    #40118651
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff, думал здесь история закончилась, но не во всех ситуациях работает правильно последний запрос.

Не могу понять почему?

возвращает в некоторых случаях хвост не правильный. В конце появляются элементы с высоким приоритетом


CUT


Модератор: Последующие подобные портянки без спойлера будут приводить к удалению всего сообщения.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Специфика порядка вывода строк в запросе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]