powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как решить такую задачу?
24 сообщений из 24, страница 1 из 1
Как решить такую задачу?
    #39410727
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день
Мне поставили такую задачу - есть таблица с списком пользователей:
CREATE TABLE NEW_TABLE_3 (
USERID INTEGER,
BADGENUMBER VARCHAR(30),
SSN VARCHAR(30),
NAME VARCHAR(30),
DEFAULTDEPTID INTEGER
);


В поле BADGENUMBER случайно попали неверные данные, это выглядит так:
пользователь Кузнецова А имеет два BADGENUMBER, один 922, другой 00922. Нужно найти всех с задублированным NAME и вывести USERID тех, у кого BADGENUMBER создан добавлением в начало 0. Это вообще реально sql сделать?
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39410736
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

реально. GROUP BY NAME + HAVING COUNT(*) > 1 потом соединяешь с исходной таблицей по NAME и в условии добавляешь BADGENUMBER STARTING WITH '0'
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39410760
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тебя правильно понял?
Код: sql
1.
2.
3.
4.
5.
6.
select count(T3.NAME), T3.NAME, T4.NAME, T4.BADGENUMBER
from NEW_TABLE_3 T3
left join NEW_TABLE_3 T4 on T3.NAME = T4.NAME
where T4.BADGENUMBER starting with '0'
group by T3.NAME, T4.NAME, T4.BADGENUMBER
having count(*) > 1
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39410769
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar, вернее так:
Код: sql
1.
2.
3.
4.
5.
6.
select count(T3.NAME), T3.NAME, T4.NAME, T4.BADGENUMBER
from NEW_TABLE_3 T3
left join NEW_TABLE_3 T4 on T3.NAME = T4.NAME
where T3.BADGENUMBER starting with '0'
group by T3.NAME, T4.NAME, T4.BADGENUMBER
having count(*) > 1
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39410772
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

почти. Я бы сделал так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with t as (
  select name
  from NEW_TABLE_3
  group by name
  having count(*) > 0
)
select NEW_TABLE_3.*
from t
join NEW_TABLE_3 ON t.name = NEW_TABLE_3.name
where BADGENUMBER starting with '0'
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39410781
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не получается. Он выводит вообще всех,кто на 0 начинается. А мне надо ещё и найти того, кто создан был с добавлением 0 к BADGENUMBER (китайская программа при попытке добавить повторяемое значение просто добавляла 0 к значению).
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39410796
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

и сколько раз она может 0 к началу дописать?
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39410798
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, 0 и 00.
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39410810
Gallemar,

Код: sql
1.
group by T3.NAME, T4.NAME, lpad(T4.BADGENUMBER,30,'0')
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39410821
Gallemar, хотя, тут тебе и такого хватит, судя по всему....

Код: sql
1.
2.
3.
4.
select USERID, name
  from NEW_TABLE_3
  group by USERID, name,  lpad(BADGENUMBER,30,'0')
  having count(*) > 1
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39410827
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх,

что-то мне кажется что USERID здесь уникальный, а потому JOIN всё равно потребуется
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39410836
Симонов Денис,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
Select t.* from NEW_TABLE_3 t
join (
select name
  from NEW_TABLE_3
  group by name,  lpad(BADGENUMBER,30,'0')
  having count(*) > 1) v
on v.name = t.name
and t.BADGENUMBER starting with '0'
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39410851
Sia-Ori1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gallemar, У вас там баджэнумбер - всё можно преобразовать к целочисленному типу или нет?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select 
    musor.userid,
    master.userid
from new_table_3 master, new_table_3 musor
where 
   (
      (cast(master.badgenumber as integer) = cast(musor.badgenumber as integer))
   )
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39410868
Sia-Ori1Gallemar, У вас там баджэнумбер - всё можно преобразовать к целочисленному типу или нет?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select 
    musor.userid,
    master.userid
from new_table_3 master, new_table_3 musor
where 
   (
      (cast(master.badgenumber as integer) = cast(musor.badgenumber as integer))
   )


как минимум, не хватает условия неравенства строки самой себе. ну и непонятно, как поступать с одинаковыми номерами, но разными именами.
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39410870
Sia-Ori1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,
ну да, потом только увидел, что вот так будет веселее
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select 
    musor.userid,
    master.userid
from new_table_3 master, new_table_3 musor
where 
   (
      (cast(master.badgenumber as integer) = cast(musor.badgenumber as integer))
   )
   and (musor.badgenumber like '0%')
   and (master.badgenumber not like  '0%')


индекс по текстовому полю поможет искать начинающиеся с 0.
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39410981
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Немного вопрос не по теме - в ms sql есть аналог starting with? Пока только додумался до like '0[^0]%'
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39410989
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarСпасибо. Немного вопрос не по теме - в ms sql есть аналог starting with? Пока только додумался до like '0[^0]%'Интересно, а чем '0[^0]%' лучше '0%'?
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39410993
Igor Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WildSery, это пример из запроса,искал начинающиеся с нуля,но без второго нуля.
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39411010
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Gallemar,

STARTING WITH никак не поможет с "регулярками", вроде.
Придётся 2 штуки писать, starting with '0' and not starting with '00'
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39411014
Igor Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WildSery, да мне надо аналогичный запросвыполнить в ms sql,а аналогичную строковую функцию не нашел.
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39411026
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarПока только додумался до like '0[^0]%'Т.е. 0abcde тебя устраивает ?
Я бы написал 0[1-9]%
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39411027
Igor Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad,да устраивает :) Удивлен, что в T-SQL нет такой функции,всегда считал,что ms sql и оракл по функционалу впереди всей планеты
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39411329
Igor GallemarУдивлен, что в T-SQL нет такой функции,всегда считал,что ms sql и оракл по функционалу впереди всей планетыВ T-SQL есть более гибкий CHARINDEX, позволяющий в общем случае определить факт вхождение одной строки в другую с любой позиции. В Oracle для этих же целей используется функция INSTR.
...
Рейтинг: 0 / 0
Как решить такую задачу?
    #39411330
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх, спасибо.
Извините, не узнаю в гриме за серым ником
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как решить такую задачу?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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