|
|
|
получение последних записей из таблицы
|
|||
|---|---|---|---|
|
#18+
Доброе время суток, сообщество! Есть задача: вывести информацию о записях, произведённых за последние сутки, но если за сутки было сделано меньше минимально допустимого количества записей, то выводить минимально допустимое количество записей. Организовал двумя запросами: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Видно, что оба запроса похожи друг на друга, поэтому возник вопрос, а можно ли это сделать одним запросом? Думаю, может connect by как-то прикрутить сюда, но не понимаю как... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 14:28 |
|
||
|
получение последних записей из таблицы
|
|||
|---|---|---|---|
|
#18+
т.е. вся задача - просто вывести последние N записей из запроса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 16:03 |
|
||
|
получение последних записей из таблицы
|
|||
|---|---|---|---|
|
#18+
Mr.Fontaine, например так Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 16:36 |
|
||
|
получение последних записей из таблицы
|
|||
|---|---|---|---|
|
#18+
GlaysMr.Fontaine, например так Код: plsql 1. 2. 3. лучше DENSE_RANK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 16:52 |
|
||
|
получение последних записей из таблицы
|
|||
|---|---|---|---|
|
#18+
GlaysMr.Fontaine, например так Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. насколько я понял поставленную задачу, нужно выводить все строки (сколько бы их не было) за последние сутки, если их кол-во больше порога (в данном случае 10). если меньше, то нужно просто вывести 10 строк последних, то есть выборка идёт дальше в прошлое, а не только за последние сутки. если так, то этот запрос хоть с rank, хоть с dense_rank не подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 17:02 |
|
||
|
получение последних записей из таблицы
|
|||
|---|---|---|---|
|
#18+
Fogel, пофиксил потерянную часть суток Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 18:01 |
|
||
|
получение последних записей из таблицы
|
|||
|---|---|---|---|
|
#18+
Glays Код: plsql 1. 2. 3. 4. 5. а если в таблице миллиард строк, для получения нескольких верхних строк все равно будешь всю таблицу агрегировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 18:18 |
|
||
|
получение последних записей из таблицы
|
|||
|---|---|---|---|
|
#18+
Mr.Fontaine, влоб Код: plsql 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. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. ps но нужно ли группировать по всей таблице ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 18:50 |
|
||
|
получение последних записей из таблицы
|
|||
|---|---|---|---|
|
#18+
FogelGlays Код: plsql 1. 2. 3. 4. 5. а если в таблице миллиард строк, для получения нескольких верхних строк все равно будешь всю таблицу агрегировать? в исходном посте мистер тож миллиард строк группирует ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 18:52 |
|
||
|
получение последних записей из таблицы
|
|||
|---|---|---|---|
|
#18+
stax..FogelОн троллирует таких, как ты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 20:41 |
|
||
|
получение последних записей из таблицы
|
|||
|---|---|---|---|
|
#18+
Elicstax..пропущено... Он троллирует таких, как ты. не понял я ж старался ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 21:41 |
|
||
|
получение последних записей из таблицы
|
|||
|---|---|---|---|
|
#18+
Mr.Fontaine, Если тебе нужно TOP-N по группе, то ищи по этим кейвордам. Там есть два решения - через аналитику (row_number() over (partition by group_id order by time desc) ) которое дольше и рекурсивный вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 22:14 |
|
||
|
получение последних записей из таблицы
|
|||
|---|---|---|---|
|
#18+
stax..Elicпропущено... Он троллирует таких, как ты. не понял я ж старался stax, не принимайте близко к сердцу. Elic зачастую изрядно желчен. Относительно группировки по всему объёму - сразу подумал, что это не комильфо, собственно поэтому своего решения и не написал (хотя и заглянул сюда в кои-то веки), т.к. отбор первых n строк подразумевает сортировку, а сортировка - выборку полного набора, то есть в данном случае группировку по всей массе, поэтому в лоб решать, применяя вначале агрегат, потому сортировку - это канонично, но на больших объёмах тяжело. поэтому я бы действовал точно не в лоб: кода больше, но на громадных объёмах быстрее. есть мысль насчёт алгоритма, надо его только выразить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 08:29 |
|
||
|
получение последних записей из таблицы
|
|||
|---|---|---|---|
|
#18+
PS: относительно троллинга, насколько помню, фраза относилась к снобам, которые "набор знаний" считают заменой ума. то есть тех, кто встречает по "одёжке" в виде этих самых знаний и тычет в RTFM каждому встречному. просто не люблю снобов, тем более не очень умных, хотя и весьма образованных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 08:45 |
|
||
|
получение последних записей из таблицы
|
|||
|---|---|---|---|
|
#18+
stax..Mr.Fontaine, влоб Код: plsql 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. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. ps но нужно ли группировать по всей таблице ..... stax Спасибо, что навёл на мысль. В итоге получилось проще: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Про группировку всей таблицы.... Дело в том, что я, к сожалению, не придумал какой where тут поставить. Суть в том, что m_field - грубо говоря, идентификатор заказа, s_field - время корректировки заказа. Заказ могут править несколько раз на дню, а могут и пару раз за неделю корректировку производить. То есть твои данные могут иметь вид Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Поэтому и делам группировку, определяя максимальную дату редактирования заказа. таблица table_LoadInfo - своеобразный лог корректировок информации о заказе (а точнее, загрузок в БД, ибо на своём компьютере пользователь может сколько угодно раз изменять параметры и производить расчёты и только потом приемлемый результат загрузить в базу). Требуется вывести список заказов, которые были изменены в течении последних суток, но чтобы табличка в форме по понедельникам не была пустой решили в случае отсутствия корректировок выводить последние 10 изменённых заказов. То есть изначально непонятно, сколько строк выбирать из таблицы, чтобы произвести группировку. Если подскажешь какое условие поставить чтобы группировать только часть информации из таблицы (понятно, что большинство заказов давно не используются и вытаскивать их при группировке каждый раз смысла нет) P.S. Кстати, значения "одни сутки" и "минимум 10 заказов" могут меняться, в процедуре, в которой находится данный запрос они заданы как входные параметры, потому на цифрах sysdate-1 и rownum<=10 можно не зацикливаться, ставить любые значения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 14:05 |
|
||
|
получение последних записей из таблицы
|
|||
|---|---|---|---|
|
#18+
Mr.FontaineСпасибо, что навёл на мысль. В итоге получилось проще: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Про группировку всей таблицы.... Дело в том, что я, к сожалению, не придумал какой where тут поставить. Суть в том, что m_field - грубо говоря, идентификатор заказа, s_field - время корректировки заказа. Заказ могут править несколько раз на дню, а могут и пару раз за неделю корректировку производить. То есть твои данные могут иметь вид Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Поэтому и делам группировку, определяя максимальную дату редактирования заказа. таблица table_LoadInfo - своеобразный лог корректировок информации о заказе (а точнее, загрузок в БД, ибо на своём компьютере пользователь может сколько угодно раз изменять параметры и производить расчёты и только потом приемлемый результат загрузить в базу). Требуется вывести список заказов, которые были изменены в течении последних суток, но чтобы табличка в форме по понедельникам не была пустой решили в случае отсутствия корректировок выводить последние 10 изменённых заказов. То есть изначально непонятно, сколько строк выбирать из таблицы, чтобы произвести группировку. Если подскажешь какое условие поставить чтобы группировать только часть информации из таблицы (понятно, что большинство заказов давно не используются и вытаскивать их при группировке каждый раз смысла нет) P.S. Кстати, значения "одни сутки" и "минимум 10 заказов" могут меняться, в процедуре, в которой находится данный запрос они заданы как входные параметры, потому на цифрах sysdate-1 и rownum<=10 можно не зацикливаться, ставить любые значения звиняюсь ошибочку сделал WHERE (r_k > 10 and s_field >= (SYSDATE - 1 )) or (r_k<=10 and rownum<=10) order by 1 странно что никто не поправил на счет понедельника имхо если понедельник то брать с "пятницы" в идеале брать предыдущую дату "рабочий день" с календаря сразу учтете 1,2 мая и тд ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 15:34 |
|
||
|
получение последних записей из таблицы
|
|||
|---|---|---|---|
|
#18+
stax.., вот чтоб с календарями не возиться и решили выводить минимум 10 записей, не обращая в какой день они были загружены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 06:23 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39354752&tid=1886944]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
175ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 510ms |

| 0 / 0 |
