Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Переставить номера строк в случ. порядке  [new]
CmeTanka в бане
Guest
Допустим, есть таблица вида

name number
============
aaaa 23
bbbb 14
ccc 12
asdfd 18
vbvcv 11

дык вот, нужно случайным образом переставить эти номера, чтоб получилось чё-нить типа

name number
============
aaaa 14
bbbb 11
ccc 18
asdfd 23
vbvcv 12

можно ли это быстро сделать на T-sql, при условии что будет около 1000 строк?
17 июл 09, 10:26    [7427601]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
select
      *
from Tbl
order by newid()


Сообщение было отредактировано: 17 июл 09, 10:29
17 июл 09, 10:29    [7427612]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
SET NOCOUNT ON;
USE tempdb;
GO
IF OBJECT_ID(N'vRand','V') IS NOT NULL DROP VIEW vRand;
GO
CREATE VIEW vRand(F) AS SELECT RAND();
GO
IF OBJECT_ID(N'fRand','FN') IS NOT NULL DROP FUNCTION fRand;
GO
CREATE FUNCTION dbo.fRand() RETURNS FLOAT AS BEGIN RETURN(SELECT F FROM vRand); END;
GO
SELECT * FROM [таблица] ORDER BY dbo.fRand();
17 июл 09, 10:37    [7427676]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
CmeTanka в бане
Guest
iap
SET NOCOUNT ON;
USE tempdb;
GO
IF OBJECT_ID(N'vRand','V') IS NOT NULL DROP VIEW vRand;
GO
CREATE VIEW vRand(F) AS SELECT RAND();
GO
IF OBJECT_ID(N'fRand','FN') IS NOT NULL DROP FUNCTION fRand;
GO
CREATE FUNCTION dbo.fRand() RETURNS FLOAT AS BEGIN RETURN(SELECT F FROM vRand); END;
GO
SELECT * FROM [таблица] ORDER BY dbo.fRand();

это решение не катит, так случайные номера не должны повторятся в таблице
17 июл 09, 10:41    [7427700]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2CmeTanka в бане
а где они повторяются? с точностью до 18 знаков?

для спящего время бодрствования равносильно сну
17 июл 09, 10:43    [7427723]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
CmeTanka в бане
iap
SET NOCOUNT ON;
USE tempdb;
GO
IF OBJECT_ID(N'vRand','V') IS NOT NULL DROP VIEW vRand;
GO
CREATE VIEW vRand(F) AS SELECT RAND();
GO
IF OBJECT_ID(N'fRand','FN') IS NOT NULL DROP FUNCTION fRand;
GO
CREATE FUNCTION dbo.fRand() RETURNS FLOAT AS BEGIN RETURN(SELECT F FROM vRand); END;
GO
SELECT * FROM [таблица] ORDER BY dbo.fRand();

это решение не катит, так случайные номера не должны повторятся в таблице
Это Вы о чём?
Откуда я знаю, какие номера у Вас в таблице? Уж вы сами позаботьтесь, пожалуйста, чтобы они не повторялись.

Не вижу принципиальной разницы между моим вариантом и вариантом tpg.
Наверно, ORDER BY NEWID() пошустрее будет.
Но с другой стороны, кто обещал, что NEWID() генерирует случайные значения?
А вот функция RAND() специально предназначена для генерирования (псевдо)случайного значения.
Microsoft, как говорится, гарантирует!
17 июл 09, 10:47    [7427757]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2iap + tpg
вчитайтесь в условии задачи.. он не переставляет строки. переставляет строки только во 2ой колонке.

для спящего время бодрствования равносильно сну
17 июл 09, 10:50    [7427781]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
sfans
Member

Откуда:
Сообщений: 392
iap,

Автор немного не то просит, что Вы предложили
в оригинальной таблице
'bbbb', 14

а получить надо
'bbbb', (23 или 18 или 12 или 11)
17 июл 09, 10:50    [7427782]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
iljy
Member

Откуда:
Сообщений: 8711
iap,
а зачем так сложно? вот так не проще?
select * from T order by (select RAND())
17 июл 09, 10:50    [7427783]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
select t1.a, t2.b from (select *, row_number() rn from t) t1 join (select *, row_number()(order by new_id()) rn) t2 on t1.a = t2.a

для спящего время бодрствования равносильно сну
17 июл 09, 10:53    [7427800]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
iljy
Member

Откуда:
Сообщений: 8711
sfans,

тогда так
select name, number from
(select name, row_number() over(order by (select 1)) r_n from T) t1
  join
(select number, row_number() over(order by(select RAND())) r_n) t2
  on t1.r_n = t2.r_n
17 июл 09, 10:54    [7427804]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
select t1.a, t2.b
 from (select *, row_number() rn from t) t1
   join (select *, row_number()(order by new_id()) rn from t) t2
     on t1.a = t2.a

для спящего время бодрствования равносильно сну
17 июл 09, 10:54    [7427807]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
sfans
Member

Откуда:
Сообщений: 392
sfans
iap,

Автор немного не то просит, что Вы предложили
в оригинальной таблице
'bbbb', 14

а получить надо
'bbbb', (23 или 18 или 12 или 11)


Судя по условию случайности получить надо
'bbbb', (23 или 18 или 12 или 11 или опять же 14)
17 июл 09, 10:54    [7427810]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
Ох...ий программизд
Guest
iljy,

iljy
вот так не проще?
select * from T order by (select RAND())

не проще.
попробуйте так
select RAND(), * from T
и поглядите, что у вас сгенерится в первом столбце.
17 июл 09, 10:55    [7427818]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
CmeTanka в бане
Guest
Ох...ий программизд
iljy,

iljy
вот так не проще?
select * from T order by (select RAND())

не проще.
попробуйте так
select RAND(), * from T
и поглядите, что у вас сгенерится в первом столбце.

+1

у меня получилось

0,371828826034513 12
0,371828826034513 23
0,371828826034513 34
0,371828826034513 17
0,371828826034513 78
0,371828826034513 10
0,371828826034513 13
0,371828826034513 3
0,371828826034513 4
0,371828826034513 77
17 июл 09, 10:59    [7427836]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
iljy
Member

Откуда:
Сообщений: 8711
Ох...ий программизд,
точно, совсем забыл про этот прикол:(( тогда проще наверное действительно newid()
17 июл 09, 10:59    [7427838]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
CmeTanka в бане
Guest
Поясню задачу из множества уникальных числе в таблице нужно выбрать случайное подмножество

сделал так как посоветовали с newid()
create table #tmp (id int )

insert into #tmp values(12)
insert into #tmp values(23)
insert into #tmp values(34)
insert into #tmp values(17)
insert into #tmp values(78)
insert into #tmp values(10)
insert into #tmp values(13)
insert into #tmp values(3)
insert into #tmp values(4)
insert into #tmp values(77)


select top 5 id, NEWID() from  #tmp order by 2 ASC

работает, только волнует скорость генерации этих гуйдов
17 июл 09, 11:01    [7427851]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
iap привел такой код, что в первом столбце будут разные значения.

для спящего время бодрствования равносильно сну
17 июл 09, 11:02    [7427856]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2CmeTanka в бане
на 1000 записей и глазом не успеете моргнуть.

для спящего время бодрствования равносильно сну
17 июл 09, 11:03    [7427857]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
CmeTanka в бане
Guest
блин, нифига не работает, подмножество всегда одинаковое получается... ааааа.....
не заметил
17 июл 09, 11:03    [7427863]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2CmeTanka в бане
потрудитесь перечитать весь топик. уже дали рабочие варианты.

для спящего время бодрствования равносильно сну
17 июл 09, 11:04    [7427872]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
iljy
Member

Откуда:
Сообщений: 8711
Алексей2003,

да, я понял. когда-то давно приходилось такое писать - делал что-то вроде
oder by sin(1000 * ID * RAND())
получалось боле-менее:)
17 июл 09, 11:06    [7427886]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
iljy
Member

Откуда:
Сообщений: 8711
CmeTanka в бане,
? попробуйте еще раз;) я специально только что проверил - все работает как предполагалось.
17 июл 09, 11:07    [7427895]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
а этот код точно упорядочивает?
select name, row_number() over(order by (select 1)) r_n from T

для спящего время бодрствования равносильно сну
17 июл 09, 11:09    [7427909]     Ответить | Цитировать Сообщить модератору
 Re: Переставить номера строк в случ. порядке  [new]
CmeTanka в бане
Guest
iljy
Алексей2003,

да, я понял. когда-то давно приходилось такое писать - делал что-то вроде
oder by sin(1000 * ID * RAND())
получалось боле-менее:)

хм, вроде работает
написал
select top 5 * from #tmp order by (sin(1000 * id * RAND()))
А в чём прикол? зачем там этот синус?
17 июл 09, 11:09    [7427911]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить