Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
не могу подобрать подходящую функцию или логику, что бы найти значение поля [DistributorID] соответствующее максимальному значению поля [Date] SET DATEFIRST 1 DECLARE @last_month int = 6; DECLARE @last_year int = 2018; DECLARE @FirstYear int = 2015; Declare @Last_Day datetime = CONVERT(datetime, CONVERT(varchar, @last_month) + '/1/' + CONVERT(varchar, @last_year), 101); Declare @Last_Week int = datepart(isowk, dateadd(month,1,dateadd(day,1-day(@Last_Day),@Last_Day))-1)-1; Declare @date datetime = CONVERT(varchar, '01/01/' + CONVERT(varchar, CASE WHEN @last_year != DATEPART(year, getdate()-10) THEN (DATEPART(year, getdate()-10)) ELSE @last_year END), 101); Declare @sDay int = DatePart(dw, @date); Set @date = @date - @sDay + 1 + CASE WHEN @sDay > 4 then 7 else 0 END; SELECT [RetailID], MAX([DistributorID]) AS [DistributorID], MAX([Date]) AS [LastDate] FROM ( SELECT [RetailID], [DistributorID], [Date] FROM (SELECT MAX([ID]) AS [ID], MAX(DATEADD(dd, [Week] * 7 - 1, @date)-2) AS [Date] FROM [tblSaleWeek] WHERE ([year] = @last_year) GROUP BY [RetailID]) AS [SW] INNER JOIN [tblSaleWeek] AS [S] ON [SW].[ID]=[S].[ID] UNION SELECT [RetailID], [DistributorID], [Date] FROM (SELECT MAX([ID]) AS [ID], DATEADD(mm, 1, MAX(CONVERT(datetime, CONVERT(varchar, [Month]) + '/1/' + CONVERT(varchar, [year]), 101) ) )-1 AS [Date] FROM [tblSale] WHERE [Packs_sold] > 0 AND [year] BETWEEN @FirstYear AND @last_year-1 GROUP BY [RetailID]) AS [SM] INNER JOIN [tblSale] AS [S] ON [SM].[ID]=[S].[ID] ) AS [D] GROUP BY [RetailID] order by 3 desc вместо MAX([DistributorID]) должно быть последнее значение [DistributorID] из строки в которой поле [Date] равно значению MAX([Date]) Таблицы [tblSale] и [tblSaleWeek] одинаковые по структуре. за исключением одного поля в [tblSale] поле [Month] (int) , а в [tblSaleWeek] такое же поле называется [Week] В поле [Month] - номера месяцев, а в поле [Week] - номера недель ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2018, 16:19 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
boa_KAA, selec f1 from t1 where t1.f1 = (select max(t2.f2) from t2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2018, 18:03 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. P.S. Спойлер не читал. Поэтому и зрение своё сохранил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2018, 18:28 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
iap, вот и получается, что в from одного поля надо практически весь данный запрос дублировать, а я надеялся какое-то более изящное решение найти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2018, 19:47 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
Владислав Колосов, могли бы на моем примере показать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2018, 01:31 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
boa_KAAВладислав Колосов, могли бы на моем примере показать? Я не Влад, но скажу. ))) Перепишите запрос в понятном виде, а не так как вам его сформировала студия. ТОгда возможно логика будет яснее. используйте алиасы. В общем случае, не понятно, почему непонятны ясные ответы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2018, 08:59 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
asdor, Во-первых код рукописный, а не сформирорванный студией, во-вторых алиасы в коде используются по мере необходимости. Но при вставке на форум исчезли все отступы и поэтому код имеет не совсем читабельный вид. Попробую объяснить логику, может так будет понятней. Как я уже писал в первом сообщении есть две таблицы. Мне надо выбрать список уникальных клиентов(RetailID) с послендней датой отгрузки AS [LastDate] и последним складом с которого грузились (DistributorID). Этот список выбирается за последние 3 года + текущий. отдельно из каждой таблицы я данный список получаю, но при объединении результатов, естественно, появляются дубли [RetailID]. Группировка по полям [RetailID] и [DistributorID] не дает нужного результата, т.к. клиент(RetailID) мог в прошлых годах грузится с другого склада (DistributorID), а надо выбрать именно последний. Данные по текущему году выбираются из таблицы tblSaleWeek, а предыдущие года из таблицы tblSale поэтому: 1) в конечный результат можно взять все значения полученные из tblSaleWeek и дополнить недостающими RetailID из отчета полученного из tblSale. 2) Либо в объединенном отчете выбрать DistributorID соответствующий максимальной дате. Но как это реализовать я не знаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2018, 11:34 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
boa_KAAНо при вставке на форум исчезли все отступы и поэтому код имеет не совсем читабельный вид.Нужно выделить исходный код, и нажать кнопочку "исходный код" в интерфейсе публикации поста в форуме. boa_KAA1) в конечный результат можно взять все значения полученные из tblSaleWeek и дополнить недостающими RetailID из отчета полученного из tblSale.Это называется "связать", а не "объединить". Нужно сделать FULL JOIN первого и второго запроса по [RetailID], и брать [RetailID], [DistributorID] по ISNULL из первого или второго набора. Но запросы у вас странные, ведь MAX для даты и ИД будут относиться к разным записям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2018, 11:57 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
alexeyvgНужно сделать FULL JOIN первого и второго запроса по [RetailID], и брать [RetailID], [DistributorID] по ISNULL из первого или второго набора. Спасибо, в понедельник, попробую разобраться. дома нет доступа к базе Пробовал через OUTER JOIN, но что-то у меня ничего не вышло. alexeyvgНо запросы у вас странные, ведь MAX для даты и ИД будут относиться к разным записям. вы имели ввиду Код: sql 1. здесь все просто, для данного запроса я делал группировку по RetailID и получал последний ИД-шник записи соответствующей последней отгрузке для каждого клиента и уже из этой строки вытягивал DistributorID Может, конечно, кривовато, но работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2018, 12:39 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
boa_KAAalexeyvgНо запросы у вас странные, ведь MAX для даты и ИД будут относиться к разным записям. вы имели ввиду Код: sql 1. здесь все просто, для данного запроса я делал группировку по RetailID и получал последний ИД-шник записи соответствующей последней отгрузке для каждого клиента и уже из этой строки вытягивал DistributorIDЯ не про DistributorID, а про [Date], она то "вытягивается" неправильно. Кривовато, и работает только потому, что у вас наверняка даты монотонно возрастают одновременно с ростом ID Но стоит, например, добавить какие то данные в процессе ручных фиксов или загрузок, как этот запрос будет выдавать неправильный результат. Хотя, может, вам так и надо, что бы DistributorID и [Date] были из разных записей? boa_KAAalexeyvgНужно сделать FULL JOIN первого и второго запроса по [RetailID], и брать [RetailID], [DistributorID] по ISNULL из первого или второго набора. Спасибо, в понедельник, попробую разобраться. дома нет доступа к базеЕсли в лоб, то как то так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. boa_KAAПробовал через OUTER JOIN, но что-то у меня ничего не вышло.Если иметь справочник RetailID, то можно и проще написать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2018, 16:01 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
Спасибо, alexeyvg, alexeyvgНо стоит, например, добавить какие то данные в процессе ручных фиксов или загрузок, как этот запрос будет выдавать неправильный результат. точно, я это уже позже понял, после вашего замечания, но у нас действительно данные добавляются по наростающей, поэтому ошибка и не бросилась в глаза. alexeyvgЕсли иметь справочник RetailID, то можно и проще написать. справочник есть tblRetail и в нем соответствующее поле ID, и этот запрос потом к нему линкуется Вообще-то это часть запроса, весь запрос ~6тыс. знаков в итоге получаю справочник с реквизитами клиентов, последнюю активность(склад, дата) и тотальные продажи за последние 3 года по годам, за текущий год и за последний месяц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2018, 20:16 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
boa_KAAiap, вот и получается, что в from одного поля надо практически весь данный запрос дублировать, а я надеялся какое-то более изящное решение найти. А в чем проблема? Перенесите его в СТЕ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2018, 20:54 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
boa_KAAсправочник есть tblRetail и в нем соответствующее поле ID, и этот запрос потом к нему линкуетсяТогда так попробуйте Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2018, 23:42 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
boa_KAAне могу подобрать подходящую функцию или логику, что бы найти значение поля [DistributorID] соответствующее максимальному значению поля [Date] SET DATEFIRST 1 DECLARE @last_month int = 6; DECLARE @last_year int = 2018; DECLARE @FirstYear int = 2015; Declare @Last_Day datetime = CONVERT(datetime, CONVERT(varchar, @last_month) + '/1/' + CONVERT(varchar, @last_year), 101); Declare @Last_Week int = datepart(isowk, dateadd(month,1,dateadd(day,1-day(@Last_Day),@Last_Day))-1)-1; Declare @date datetime = CONVERT(varchar, '01/01/' + CONVERT(varchar, CASE WHEN @last_year != DATEPART(year, getdate()-10) THEN (DATEPART(year, getdate()-10)) ELSE @last_year END), 101); Declare @sDay int = DatePart(dw, @date); Set @date = @date - @sDay + 1 + CASE WHEN @sDay > 4 then 7 else 0 END; SELECT [RetailID], MAX([DistributorID]) AS [DistributorID], MAX([Date]) AS [LastDate] FROM ( SELECT [RetailID], [DistributorID], [Date] FROM (SELECT MAX([ID]) AS [ID], MAX(DATEADD(dd, [Week] * 7 - 1, @date)-2) AS [Date] FROM [tblSaleWeek] WHERE ([year] = @last_year) GROUP BY [RetailID]) AS [SW] INNER JOIN [tblSaleWeek] AS [S] ON [SW].[ID]=[S].[ID] UNION SELECT [RetailID], [DistributorID], [Date] FROM (SELECT MAX([ID]) AS [ID], DATEADD(mm, 1, MAX(CONVERT(datetime, CONVERT(varchar, [Month]) + '/1/' + CONVERT(varchar, [year]), 101) ) )-1 AS [Date] FROM [tblSale] WHERE [Packs_sold] > 0 AND [year] BETWEEN @FirstYear AND @last_year-1 GROUP BY [RetailID]) AS [SM] INNER JOIN [tblSale] AS [S] ON [SM].[ID]=[S].[ID] ) AS [D] GROUP BY [RetailID] order by 3 desc вместо MAX([DistributorID]) должно быть последнее значение [DistributorID] из строки в которой поле [Date] равно значению MAX([Date]) Таблицы [tblSale] и [tblSaleWeek] одинаковые по структуре. за исключением одного поля в [tblSale] поле [Month] (int) , а в [tblSaleWeek] такое же поле называется [Week] В поле [Month] - номера месяцев, а в поле [Week] - номера недель Тебе нужен запрос. Конкретнее - select! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2018, 09:49 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
alexeyvg, Спасибо, очень интересно, завтра же займусь. Опреатор apply никогда не использовал, но что-то нагуглю. но кажется, если следовать логике, то в ORDER BY вложенных запросов [SW] и [SМ] надо, все таки не [ID] сортировать, а дату. И тут сразу вопрос, будет ли отличаться скорость выполнения если сортировать преобразованную дату от если сортировать "склееные" поля Year & Month(Week) приведенные к строке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2018, 12:56 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
MasterZivТебе нужен запрос. Конкретнее - select! Вот честное слово, понятия не имею о чем это вы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2018, 12:58 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
boa_KAAно кажется, если следовать логике, то в ORDER BY вложенных запросов [SW] и [SМ] надо, все таки не [ID] сортировать, а дату.Ну, вы же брали макс. ID? Я просто повторил логику в своём варианте. Но по бизнес логике наверняка нужно сортировать по дате. boa_KAAИ тут сразу вопрос, будет ли отличаться скорость выполнения если сортировать преобразованную дату от если сортировать "склееные" поля Year & Month(Week) приведенные к строке?Скорость зависит от индексов, есть разные варианты, и их много. В общем случае максимальную скорость можно получить при сортировке по полю даты. Кроме того, сортировать лучше по дате, а не склеенному значению, ведь логика сортировки от этого не меняется, правда? Более того, тут нужно правильно сформулировать бизнес-задачу. Если требуется "взять последнее", а сортировать будем по склеенному значению, то мы получим неправильный DistributorID ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2018, 13:20 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
alexeyvg, alexeyvgСкорость зависит от индексов, есть разные варианты, и их много. В общем случае максимальную скорость можно получить при сортировке по полю даты. как такового поля даты нет. если вы обратили внимание есть номер месяца/недели и год отчеты в базу загружаются понедельно и/или помесячно, и поденной разбивки в них нет. Это я уже преобразую значения в дату, что бы потом проще было в Excel с ними работать. Но т.к. значения в полях интегер, то для правильной сортировки надо к номерам 1-9 добавлять ноль(это если склеивать в строку) или преобразовывать в дату(как я делал в коде выше). Но и в первом и во вторм варианте это "сборное" поле. Так вот суть вопроса в следующем: что быстрее будет сортироваться строка из чисел или дата, или строка из чисел преобразованая в бигинтегер, для двух одних и тех же полей без учета индексов? Хотя, наверное, я многого не знаю про индексы и их можно как-то добавлять на время сеанса... Вообще-то у меня ограниченный доступ к базе и даже временную таблицу я в ней не могу создать(по крайней мере не получилось), а уж добавлять индексы к полям, наверное и подавно. Плюс, данный запрос формируется в Excel и через OLEDB получает данные с SQL-сервера. И тут тоже веселуха, т.к. то, что знает MSSQL, не всегда понимает SQL в MSOffice и наоброт. Про сортировку по "макс. ID" - это я ж выше писал, что протупил. Хоть оно сейчас и работает, "завтра", что-то поменяется и результат будет не правильным. Здесь я с вами абсолютно согласился. Иначе, зачем искать макс Дату, если проще по индексированному полю (ИД) найти макс и вытянуть с него и дату, и DistributorID. alexeyvgЕсли требуется "взять последнее", а сортировать будем по склеенному значению, то мы получим неправильный DistributorID Это условие из-за которого все и началось. В одном временном промежутке (месяц/неделя) может быть 2 и более DistributorID, нужно вычленить последнего, т.е. запись с максимальным ИД для последнего временного периода имеющегося в базе в таблицах Сэлс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2018, 16:43 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
boa_KAAТак вот суть вопроса в следующем: что быстрее будет сортироваться строка из чисел или дата, или строка из чисел преобразованая в бигинтегер, для двух одних и тех же полей без учета индексов?Разницы особой нет. boa_KAAalexeyvgЕсли требуется "взять последнее", а сортировать будем по склеенному значению, то мы получим неправильный DistributorID Это условие из-за которого все и началось. В одном временном промежутке (месяц/неделя) может быть 2 и более DistributorID, нужно вычленить последнего, т.е. запись с максимальным ИД для последнего временного периода имеющегося в базе в таблицах Сэлс.Тогда можно просто делать сортировку по ID, ведь в любом случае бОльшие значения означают более поздние записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2018, 17:22 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
alexeyvgТогда можно просто делать сортировку по ID, ведь в любом случае бОльшие значения означают более поздние записи. в том то и дело, что уже нет, есть перезалитые периоды. alexeyvgКривовато, и работает только потому, что у вас наверняка даты монотонно возрастают одновременно с ростом ID Но стоит, например, добавить какие то данные в процессе ручных фиксов или загрузок, как этот запрос будет выдавать неправильный результат. А вот с этим абсолютно согласен. и после того как адаптирую ваш код под свои нужды, обязательно это учту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2018, 19:27 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
alexeyvgТогда можно просто делать сортировку по ID, ведь в любом случае бОльшие значения означают более поздние записи. сорри, опять протупил конечно сортировку :) найти записи с максимальной датой, отсортировать с параметром desc и взять top 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2018, 19:39 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#18+
boa_KAAalexeyvgТогда можно просто делать сортировку по ID, ведь в любом случае бОльшие значения означают более поздние записи. в том то и дело, что уже нет, есть перезалитые периоды. boa_KAAalexeyvgТогда можно просто делать сортировку по ID, ведь в любом случае бОльшие значения означают более поздние записи. сорри, опять протупил конечно сортировку :) найти записи с максимальной датой, отсортировать с параметром desc и взять top 1Собственно, это не вопросы по MSSQL, это вопросы бизнес-логики. Тут важно, что такая конструкция с OUTER APPLY позволяет легко сделать любую сортировку, взяв нужную запись в соответствии с бизнес-логикой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2018, 20:37 |
|
||
|
Поиск значения одного поля по максимальному значению другого
|
|||
|---|---|---|---|
|
#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. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. Спасибо Алексею(alexeyvg) и другим участникам за помощь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2018, 16:25 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39674048&tid=1689406]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 232ms |
| total: | 390ms |

| 0 / 0 |
