Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как решить такую задачу? / 24 сообщений из 24, страница 1 из 1
27.02.2017, 11:33
    #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
27.02.2017, 11:37
    #39410736
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как решить такую задачу?
Gallemar,

реально. GROUP BY NAME + HAVING COUNT(*) > 1 потом соединяешь с исходной таблицей по NAME и в условии добавляешь BADGENUMBER STARTING WITH '0'
...
Рейтинг: 0 / 0
27.02.2017, 11:57
    #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
27.02.2017, 12:01
    #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
27.02.2017, 12:02
    #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
27.02.2017, 12:09
    #39410781
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как решить такую задачу?
Не получается. Он выводит вообще всех,кто на 0 начинается. А мне надо ещё и найти того, кто создан был с добавлением 0 к BADGENUMBER (китайская программа при попытке добавить повторяемое значение просто добавляла 0 к значению).
...
Рейтинг: 0 / 0
27.02.2017, 12:16
    #39410796
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как решить такую задачу?
Gallemar,

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

Код: sql
1.
group by T3.NAME, T4.NAME, lpad(T4.BADGENUMBER,30,'0')
...
Рейтинг: 0 / 0
27.02.2017, 12:29
    #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
27.02.2017, 12:32
    #39410827
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как решить такую задачу?
Добрый Э - Эх,

что-то мне кажется что USERID здесь уникальный, а потому JOIN всё равно потребуется
...
Рейтинг: 0 / 0
27.02.2017, 12:37
    #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
27.02.2017, 12:46
    #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
27.02.2017, 13:01
    #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
27.02.2017, 13:05
    #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
27.02.2017, 15:12
    #39410981
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как решить такую задачу?
Спасибо. Немного вопрос не по теме - в ms sql есть аналог starting with? Пока только додумался до like '0[^0]%'
...
Рейтинг: 0 / 0
27.02.2017, 15:18
    #39410989
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как решить такую задачу?
GallemarСпасибо. Немного вопрос не по теме - в ms sql есть аналог starting with? Пока только додумался до like '0[^0]%'Интересно, а чем '0[^0]%' лучше '0%'?
...
Рейтинг: 0 / 0
27.02.2017, 15:21
    #39410993
Igor Gallemar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как решить такую задачу?
WildSery, это пример из запроса,искал начинающиеся с нуля,но без второго нуля.
...
Рейтинг: 0 / 0
27.02.2017, 15:40
    #39411010
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как решить такую задачу?
Igor Gallemar,

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


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