Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Добрый день. Помогите пожалуйста правильно составить запрос. Есть несколько таблиц. Таблица А. Надо получить сумму ячейки Status по определенному [OID] за определенный промежуток даты: Код: sql 1. 2. 3. 4. 5. 6. Таблица Б. Тут нужно получить последнюю дату где [view] = простой, которую надо игнорировать во время опроса Таблицы А: Код: sql 1. 2. 3. Таблица В. Тут список [OID] которые нужно получить во время всего опроса: Код: sql 1. 2. 3. 4. То-есть: 1) берем наш [IP] = 1.2.3.4 . 2) Вытягиваем 3 [OID] из Таблицы В. 3) Суммируем колонку Status из Таблицы А, каждый [OID] по отдельности за определенный период времени. 4) Во время суммирования Status из Таблица А игнорируем время превышающее дату из Таблицы Б, но только у [OID] который прописан в Таблице Б. Вот с четвертым пунктом у меня проблемы. Может можно как то сделать это одним запросом? Сейчас запрос без четвертого пункта выглядит так: Код: sql 1. 2. 3. 4. 5. 6. 7. Может можно как то добавить к запросу: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 08:37 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Hopfen_Artur, вам, для начала, нужно посчитать отдельно все агрегаты по требуемым промежуткам, а уж затем - собирать результат угрегации данных в единую выборку. Иначе получите многократное задублирование данных и неверные суммы.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 08:44 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Щукина Анна, Я мягко говоря не силен в запросах, приведите пример пожалуйста. Я уж как нибудь подстрою под свои нужды =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 08:48 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Как-то так Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 09:19 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Тебе Таблицу Б надо отдельно спартиционировать (чтоб остались только максимальные даты для каждого ОИД -смотри код внизу) А потом NOT EXIST-ом сказать : "Нехочу тех из парициона, которые удовлетворяют (или наоборот неудовлетворяют) таким то требованиям" Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 09:34 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
ORDER BY Date desc и точка с запятой лишние ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 09:37 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
student-uni, Спасибо, сейчас буду пробовать =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 09:40 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
student-uni, Вот так если написать выходит ошибка: неправильный синтаксис около ключевого слова "OVER" Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 09:56 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Hopfen_Artur, а зачем вы туда пишете? OVER(PARTITION BY OID )? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 09:59 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
TaPaK, Ну вот я в select вставил, ошибок нет, но и выборки нет. Плохо разбираюсь я, учусь только: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 10:06 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Hopfen_Artur, SELECT sum(TA.Status) AS status, TB.OID AS oid FROM ТаблицаА AS TA LEFT JION ТаблицаВ AS TB ON TA.OID = TB.OID WHERE TB.IP = '1.2.3.4' AND TA.Date BETWEEN DATEADD(hour, 7, DATEDIFF(dd, 0, GETDATE())) AND DATEADD(hour, 19, DATEDIFF(dd, 0, GETDATE())) AND NOT EXISTS ( SELECT * FROM ( SELECT TOP (1) WITH TIES OID, Date FROM TABLITSA_B WHERE [view] = 'простой' order by row_number() over (partition by OID order by Date desc) ) AS LastOidDate WHERE LastOidDate.OID = TA.OID AND TA.Date > LastOidDate.Date ) GROUP BY TB.OID ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 10:07 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
student-uni, выводит пустой результат. В таблицеБ может вообще не быть данных, может из за этого? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 10:49 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Hopfen_Artur, что выдает Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 10:50 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Hopfen_Artur, Код: 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.02.2019, 11:07 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Поправочка Код: 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.02.2019, 11:14 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
student-uniHopfen_Artur, что выдает Код: sql 1. 2. 3. 4. 5. выдает такой результат: Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 11:21 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
invm, спасибо, сейчас попробую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 11:21 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Hopfen_Artur, Left Join не нужен и вместо TB.OID ставим TA.OID Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 11:34 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
student-uni, Спасибо вам большое. Я попробую доработать вариант invm . У него учитывается промежуток времени Таблицы Б. invm, Запрос работает ,спасибо. Но подскажи пожалуйста как добавить условие. Мы сейчас берем максимальную дату с соответствующим OID. Но нужно игнорировать ее, если View != 'простой'. То-есть получили максимальную дату и посмотрели колонку View. Если не соответствует, игнорируем. Можно ли так сделать? Может сам додумаюсь, заранее спасибо =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 11:39 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Hopfen_ArturНо нужно игнорировать ее, если View != 'простой'Добавить соответствующее условие в where запроса к ТаблицаБ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 11:48 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
invmHopfen_ArturНо нужно игнорировать ее, если View != 'простой'Добавить соответствующее условие в where запроса к ТаблицаБ. А он разве не будет искать последнюю дату именно где View != 'простой' ? Допустим ТаблицаБ: Код: sql 1. 2. 3. Если я просто напишу WHERE View = 'простой' он выберет вторую строку, хотя в таблице есть дата с более максимальным временем. А если напишу WHERE View != 'простой' то при такой таблице : Код: sql 1. 2. 3. Выберет вторую строку, что в корне не верно. Ведь нам нужны именно View == 'простой'. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 12:04 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Hopfen_Arturstudent-uni, Спасибо вам большое. Я попробую доработать вариант invm . У него учитывается промежуток времени Таблицы Б. invm, Запрос работает ,спасибо. Но подскажи пожалуйста как добавить условие. Мы сейчас берем максимальную дату с соответствующим OID. Но нужно игнорировать ее, если View != 'простой'. То-есть получили максимальную дату и посмотрели колонку View. Если не соответствует, игнорируем. Можно ли так сделать? Может сам додумаюсь, заранее спасибо =) Держись, юзер! не выдавай тайну, какая версия сервера! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 12:10 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Hopfen_ArturА он разве не будет искать последнюю дату именно где View != 'простой' ?Будет. Вам нужно игнорировать, когда у максимальной StartDate для OID View = 'простой'? Тогда так: Код: 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.02.2019, 12:32 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
invm, Спасибо большое, очень выручили . Буду разбираться как это работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 13:16 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Еще такой вопрос. Допустим в промежутке выборки даты вообще нет данных: Код: sql 1. допустим наша Таблица В Код: sql 1. 2. 3. 4. По OID AA9ADECE-F455 за промежуток времени вообще нет данных. Результат выборки будет такой: Код: sql 1. 2. 3. А хотелось бы такой результат: Код: sql 1. 2. 3. 4. Я пробовал так: Код: sql 1. Но оно видимо предполагает что данные за промежуток есть, но они равны null. Может кто сталкивался с подобной проблемой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 14:20 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Hopfen_Artur, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 14:29 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
invm, Ошибка не удалось выполнить привязку составного идентификатора "TB.OID" в этой строчке: Код: sql 1. Я пробовал писать и TV.OID и tb.OID результат один и тот же. Такая же ошибка связанная с "tb.StartDate" в той же строчке. Подскажите где я мог ошибиться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 15:08 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 15:11 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Возможно это из за того что есть промежуточная таблица для связи OID таблиц А и В, вот так сейчас рабочий запрос выглядит без учета отсутствия значений: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 15:15 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Пытаюсь переделать вот так, выходят те самые ошибки: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Вот тут ошибки с CON.OID и tb.Start_date: Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 15:22 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
invm, Все я додумался, заработало. Спасибо вам =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 15:27 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Вот так заработало: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 15:27 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Добрый день, пытался по аналогии модифицировать этот запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Суть проблемы Изначально таблица database2 выглядела так: Код: sql 1. 2. 3. То-есть есть последний простой с End_date is null, после даты Start_date мы не учитываем данные. Теперь же допустим эта таблица приобрела вид: Код: sql 1. 2. 3. 4. 5. 6. Теперь же надо помимо предыдущей задачи, игнорировать промежутки времени между всеми Start_date и End_date где View_problem = 'простой' и TPA_ior = CON.OID и End_date is not null. Попробовал сам модифицировать запрос, написал так: Код: 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. 32. 33. 34. 35. 36. 37. 38. С такого запроса данные sum(RF.Status) умножились на два, и после добавления NOT BETWEEN совсем странные дела происходят он прибавляет данные и вычитает. Подскажите пожалуйста где ошибся? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2019, 09:01 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Изменил вот так, на выходе все status ноль: Код: 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.02.2019, 09:47 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Hopfen_Artur, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2019, 10:16 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Hopfen_Artur, у тебя сейчас "ТА лефт джоин ТБ" что означает "дай мне все из ТА и то из ТБ где совпадает ОИД" соответственно если в таблице А по OID AA9ADECE-F455 за промежуток времени вообще нет данных то и не будет ничего в результате, т.к. OID AA9ADECE-F455 есть только в Таблице Б. А вот если наоборот заджойнить:"ТБ лефт джоин ТА" то это будет значить "дай мне все из ТБ и то из ТА где совпадает ОИД" тогда OID AA9ADECE-F455 будет обязательно присутствивать, только ТА.Status будет равен NULL и чтоб это поправить вызывай поле с Проверкой ISNULL(TA.Status,0) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2019, 10:22 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Hopfen_Artur, у тебя сейчас "ТА лефт джоин ТБ" что означает "дай мне все из ТА и то из ТБ где совпадает ОИД" соответственно если в таблице А по OID AA9ADECE-F455 за промежуток времени вообще нет данных то и не будет ничего в результате, тк OID AA9ADECE-F455 есть только в Таблице Б. А вот если наоборот заджойнить:"ТБ лефт джоин ТА" то это будет значить "дай мне все из ТБ и то из ТА где совпадает ОИД" тогда OID AA9ADECE-F455 будет обязательно присутствивать, только ТА.Статус будет равен НИЛЛ и чтоб это поправить вызывай поле с Проверкой IS NULL(TA.Status,0) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2019, 10:23 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
invm, спасибо вам, изменил так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Получилось вот что: Допустим с 7 до 10 часов status = 30 Если database2 будет иметь такой вид: Код: sql 1. 2. Результат будет правильный status = 0 Если database2 будет иметь такой вид: Код: sql 1. 2. Результат будет правильный status = 20 Но вот если database2 будет иметь такой вид: Код: sql 1. 2. 3. Результат будет status = 20, хотя должно остаться status = 10 Видимо он смотрит только первую строку Если database2 будет иметь такой вид: Код: sql 1. 2. 3. Результат будет 20, он не учитывает строку где есть End_date is not null, а перестает считать с 9 часов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2019, 10:49 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Точнее в конце результат будет 10 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2019, 10:54 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
invm, простите, я не правильно исправил, сейчас потестирую. Спасибо большое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2019, 11:03 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
invm, ПО такому запросу: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Результаты такие же: Допустим с 7 до 10 часов status = 30 Если database2 будет иметь такой вид: Код: sql 1. 2. Результат будет правильный status = 0 Если database2 будет иметь такой вид: Код: sql 1. 2. Результат будет правильный status = 20 Но вот если database2 будет иметь такой вид: Код: sql 1. 2. 3. Результат будет status = 20, хотя должно остаться status = 10 Видимо он смотрит только первую строку Если database2 будет иметь такой вид: Код: sql 1. 2. 3. Результат будет 10, он не учитывает строку где есть End_date is not null, а перестает считать с 9 часов. Моих знаний пока не хватает самому разобраться, поищу на этом форуме похожие темы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2019, 11:29 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
Hopfen_ArturВидимо он смотрит только первую строкуБерется та строка, которая соответствует условию соединения. Уберите агрегирование и смотрите что возвращает запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2019, 11:38 |
|
||
|
Направьте на путь истинный в составлении запроса =)
|
|||
|---|---|---|---|
|
#18+
invm, спасибо за способ проверки, действительно как положено все отрабатывает, проверял так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Видимо до этого где то ошибку допустил, все правильно подсчитывает, спасибо вам большое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2019, 12:07 |
|
||
|
|

start [/forum/topic.php?all=1&fid=46&tid=1688229]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
131ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 476ms |

| 0 / 0 |
