Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вытаскивание value по максимумам другого поля 
:(
    Опции темы
Random13
Дата 28.4.2009, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Есть у меня таблица

id idDeviceReg  idPart        idType     value
1    5                   1                 17            2
2    5                   1                 18            63
3    5                   6                 14             89
4    8                   6                 14            90

Задача - вытащить значения value, ну или id - все равно, по приоритету максимума idDeviceReg, чтобы  idPart, idType не повторялись. То есть в данном случае третья строка уйдет. Я должен получить 1,2,4 строки как результат операции. Так как у третьей строки значения  idPart, idType такие же, как и у четвертой, но у четвертой idDeviceReg больше.

Если я даю  sql

SELECT MAX(idDeviceReg),[idPart],[idType]
FROM [tblDeviceValue]
GROUP BY [idPart],[idType]

то я получаю правильные строки как-бы, но в них нет ни id ни value. Если же выполняю

SELECT MAX(idDeviceReg),[idPart],[idType],[value]
FROM [tblDeviceValue]
GROUP BY [idPart],[idType],[value]

то в итоге получаю все строки. Проблема. То есть мне нужна выборка с присутствующим value или id, но сгруппированная только по  idPart, idType. Так группировать оно не дает. По чем выбираешь по том только и дает группировать. Может кто подскажет чего, а то я такой нуб в sql  smile 

Это сообщение отредактировал(а) Random13 - 28.4.2009, 20:03
PM MAIL   Вверх
Akina
Дата 28.4.2009, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Удалено. Ошибка.

Это сообщение отредактировал(а) Akina - 28.4.2009, 21:28


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Random13
Дата 28.4.2009, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Msg 156, Level 15, State 1, Line 6
Incorrect syntax near the keyword 'from'.

Там может описка 2 раза стоит from, если один раз убираю - выдает


Msg 8121, Level 16, State 1, Line 1
Column 'tblDeviceValue.value' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause.

Мудренный запрос мне такой не написать (... Там как я вижу  idDeviceReg  не хватает по нему нужно делать максимум, наверное  smile 

Это сообщение отредактировал(а) Random13 - 28.4.2009, 21:30
PM MAIL   Вверх
Akina
Дата 28.4.2009, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Код

SELECT tblDeviceValue.*
FROM 
(
  SELECT tblDeviceValue.idPart
       , tblDeviceValue.idType
       , Max(tblDeviceValue.value) AS Maxvalue
  FROM tblDeviceValue
  GROUP BY tblDeviceValue.idPart
         , tblDeviceValue.idType
) as q1 
INNER JOIN tblDeviceValue 
ON  (q1.Maxvalue = tblDeviceValue.value) 
AND (q1.idType = tblDeviceValue.idType) 
AND (q1.idPart = tblDeviceValue.idPart);



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Random13
Дата 28.4.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Спасибо, но пока все равно отрабатывает не правильно оно ищет по максимуму value, а не idDeviceReg. Если я меняю значения так

id idDeviceReg  idPart        idType     value
1    5                   1                 17            2
2    5                   1                 18            63
3    5                   6                 14             90
4    8                   6                 14            89

то оно мне выдает первые 3 строчки, а не 1,2,4, если я меняю максимум Max(tblDeviceValue.value) на  Max(tblDeviceValue.idDeviceReg) выдает пустое значение.
Мне просто не максимальные value нужны,  value в строчках с максимальным idDeviceReg .


Это сообщение отредактировал(а) Random13 - 28.4.2009, 21:41
PM MAIL   Вверх
Akina
Дата 28.4.2009, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Не, ну а поправить совершенно невозможно... вынь да положь готовое и отлаженное...
Мне тоже лень.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Gluttton
Дата 28.4.2009, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Код

SELECT *
FROM TBLDEVICEVALUE AS TD,
(
    SELECT
        CASE
            WHEN (
                SELECT COUNT(*) AS c
                FROM TBLDEVICEVALUE AS TA
                    WHERE T.idPart=TA.idPart
                    AND T.idType=TA.idType
                )=1
            THEN T.id
            ELSE (
                SELECT DISTINCT T.id
                FROM TBLDEVICEVALUE AS TC
                    WHERE (
                        SELECT COUNT(*) AS c
                        FROM TBLDEVICEVALUE AS TC
                            WHERE T.idPart=TC.idPart
                            AND T.idType=TC.idType
                    )>1
                    AND T.idDeviceReg=
                    (
                        SELECT MAX(TB.idDeviceReg) AS m
                        FROM TBLDEVICEVALUE AS TB
                            WHERE T.idType=TB.idType
                            AND T.idPart=TB.idPart
                    )
            )
        END AS id
    FROM TBLDEVICEVALUE AS T
)   AS SS
    WHERE TD.id=SS.id


Вот так можно ещё попробовать...


--------------------
Слава Україні!
PM MAIL   Вверх
Zloxa
Дата 28.4.2009, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Random13 @  28.4.2009,  18:29 Найти цитируемый пост)
Задача - вытащить значения value, ну или id - все равно, по приоритету максимума idDeviceReg, чтобы  idPart, idType не повторялись. 

Бабушкин метод
Код

with t as (
  select 1 id ,   5  idDeviceReg, 1 idPart, 17  idType from dual
  union all select 2, 5, 1,18 from dual
  union all select 3, 5, 6,14 from dual
  union all select 4, 8, 6,14 from dual
)
select to_number(substr(max(lpad(idDeviceReg,40,'0')||id),41)) id
       , max(idDeviceReg) idDeviceReg
       , idPart 
       , idType
from t
group by idPart,idType

ID                     IDDEVICEREG            IDPART                 IDTYPE                 
---------------------- ---------------------- ---------------------- ---------------------- 
1                      5                      1                      17                     
2                      5                      1                      18                     
4                      8                      6                      14                     

3 rows selected


если у Вас MS Sql 2005+ то он должен уметь так:
Код

select * from (
  select t.*,row_number() over ( partition by idPart,idType order by idDeviceReg desc) rn from t
)
where rn = 1

ID                     IDDEVICEREG            IDPART                 IDTYPE                 RN                     
---------------------- ---------------------- ---------------------- ---------------------- ---------------------- 
1                      5                      1                      17                     1                      
2                      5                      1                      18                     1                      
4                      8                      6                      14                     1                      

3 rows selected

У вас явно не оракл, оракл умеет еще красивее Ж)


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 29.4.2009, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Akina,  пара (idPart, idType) в результате может оказаться не уникальной, если имеем более одной записи  (idPart, idType,value=max_value)


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Random13
Дата 29.4.2009, 05:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Цитата(Akina @ 28.4.2009,  22:42)
вынь да положь готовое и отлаженное...

Извини, такой сложный запрос мне не поправить. В sql нуб, могу писать только простые запросы.

Всем, кто пытался помочь спасибо буду разбираться с тем, что дали  smile .

Отработал без ошибок только sql от Glutton. Буду в нем разбираться.


Zloxa у меня  2005 EXPRESS  и видимо так он не умеет

пишет

Msg 156, Level 15, State 1, Line 4
Incorrect syntax near the keyword 'where'.

если вере убираю

Msg 102, Level 15, State 1, Line 3
Incorrect syntax near ')'.


В первом запросе он не знает функцию lpad. И причем у меня id может быть сколько угодно, нельзя их конкретно перечислять. И задачу изначальную я упростил, выделил проблему попонятней.

Это сообщение отредактировал(а) Random13 - 29.4.2009, 06:43
PM MAIL   Вверх
Akina
Дата 29.4.2009, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Zloxa @  29.4.2009,  01:11 Найти цитируемый пост)
пара (idPart, idType) в результате может оказаться не уникальной, если имеем более одной записи  (idPart, idType,value=max_value) 

В этом случае у нас нет дополнительной информации, как выбирать одну запись из нескольких равноценных. И даже нет указания, что требуется в этом случае вывести одну, а не все.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Gluttton
Дата 29.4.2009, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Цитата

Всем, кто пытался помочь спасибо буду разбираться с тем, что дали   .


Пожалуйста!

Цитата

Отработал без ошибок только sql от Glutton. Буду в нем разбираться.


Жутко приятно, но вот только не рекомендовал бы я Вам в нем разбираться, т.к. запрос в целом "не удачный" (сложность алгоритма n^2, а это значить, что на реальных БД с количеством полей в тысячи этот запрос будет очень медленно работать, ито если и будет работать вообще smile ) . Глубоко убежден, что Вам стоит повнимательнее разобраться с примером приведенным Zloxa, он и поизящнее и по универсальнее и по быстрее моего smile .


--------------------
Слава Україні!
PM MAIL   Вверх
Random13
Дата 29.4.2009, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Цитата(Akina @ 29.4.2009,  07:46)
Цитата(Zloxa @  29.4.2009,  01:11 Найти цитируемый пост)
пара (idPart, idType) в результате может оказаться не уникальной, если имеем более одной записи  (idPart, idType,value=max_value) 

В этом случае у нас нет дополнительной информации, как выбирать одну запись из нескольких равноценных. И даже нет указания, что требуется в этом случае вывести одну, а не все.

Чтобы уточнить в таблице невозможно изначально строки где совпадают 3 поля idPart, idType и idDeviceReg.
Проблема здесь не в том, а в том, что данный запрос ищет записи по max_value, а не по max idDeviceReg. В этом запросе вообще нет упоминания этого поля...
PM MAIL   Вверх
Akina
Дата 29.4.2009, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Random13 @  29.4.2009,  10:00 Найти цитируемый пост)
Проблема здесь не в том, а в том, что данный запрос ищет записи по max_value, а не по max idDeviceReg. В этом запросе вообще нет упоминания этого поля... 

О господи! ну замените ВСЕ вхождения подстроки "value" в тексте запроса на подстроку "idDeviceReg"!


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 29.4.2009, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Random13 @  29.4.2009,  05:08 Найти цитируемый пост)
В первом запросе он не знает функцию lpad

lpad дополняет строку слева символами '0' до получения длинны 40 символов (если бы вы сходили по ссылке, которую я оставил, там прочитали бы об этом). Я не знаю диалекта ms sql. Но, думается, выражение в max может быть переведено на его диалект влегкую.. ХОтябы через конкатенацию слева нужного количества дополняющих N символов а затем выделением подстроки из последних N символов.
Цитата(Random13 @  29.4.2009,  05:08 Найти цитируемый пост)
И причем у меня id может быть сколько угодно,

Именно поэтому можно выделить лишь ID, потом сделать по нему join c исходным набором.
Цитата(Random13 @  29.4.2009,  05:08 Найти цитируемый пост)
нельзя их конкретно перечислять

Это почему же? Парадигма SQL - объекты схемы статичны, ты всегда знаешь структуру запрашиваемых данных, ты всегда знаешь структуру результата.
Цитата(Random13 @  29.4.2009,  05:08 Найти цитируемый пост)
Incorrect syntax near the keyword 'where'.

Если я правильно помню, подзапросам в ms sql, обязательно должен быть определен алиас.

Как бы там ни было, у меня нет инсталляции ms sql, вы уж как нить постарайтесь сами развить свои компетенции, правильное направление вам уже задано.

PS
Цитата(Random13 @  29.4.2009,  05:08 Найти цитируемый пост)
В sql нуб

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


Это сообщение отредактировал(а) Zloxa - 29.4.2009, 09:23


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0628 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.