Форум Торонто - Torontovka.com
[Search] [Rules] [Register] [Login]
Forums » Archive » SQL query 
Page: [1] 2 All
Author Message
Joined: 3/1/2002
Posts: 51165
Posted on Monday, December 20, 2004 1:55:00 PM
 
Флай, точно не знаю, но нутром чую - контрить нужно
Joined: 3/5/2002
Posts: 19784
Posted on Monday, December 20, 2004 1:55:00 PM
 
Короче, что-то я никак не соображу, как эту фигню замутить.
Есть таблица с тремя колонками.
"Message,TotalSent,Domain".
Мне нужно отобрать top 20 by TotalSent
per Domain per Message.

То есть для каждого Message мне нужны все верхниe 20
Domains by TotalSent.

По идее к примеру так должно выглядеть:
-------------------------------------------------------
Message1 aol.com 1000 (1-ая запись)
Message1 yahoo.com 980 (2-ая запись)
..........
Message1 rogers.com 2 (20-ая запись)
Message2 aol.com 100 (1-ая запись)
Message2 msn.ca 78 (2-ая запись)
..........
Message2 rogers.com 6 (20-ая запись)
-----------------------------------------------------
и так далее.

Идеи?



--
LONG LIVE ROCK-N-ROLL!
Joined: 3/5/2002
Posts: 19784
Posted on Monday, December 20, 2004 2:02:00 PM
 
Да я бы законтрил, да только не знаю как. :))

--
LONG LIVE ROCK-N-ROLL!
Joined: 8/24/2004
Posts: 6087
Posted on Monday, December 20, 2004 2:04:00 PM
 
Какой диалект? На чем, то бишь, пишешь?

--
KOHb a.k.a. AVL
Joined: 8/24/2004
Posts: 6087
Posted on Monday, December 20, 2004 2:05:00 PM
 
Да, и обязательно ли тебе это сделать одним запросом?

--
KOHb a.k.a. AVL
Joined: 11/12/2003
Posts: 21852
Posted on Monday, December 20, 2004 2:11:00 PM
 
group by total.sent having count(total.sent) ...

ахуй :) уже и не помню... короче ето очень просто , посмотри в хелп на т-скюл.
Joined: 8/24/2004
Posts: 6087
Posted on Monday, December 20, 2004 2:13:00 PM
 
Havoc, неправильно.

--
KOHb a.k.a. AVL
Joined: 3/5/2002
Posts: 19784
Posted on Monday, December 20, 2004 2:14:00 PM
 
Havoc,
Не верно.

Конь,
T-SQL. По любому надо сделать. Не важно в один запрос
или больше.

--
LONG LIVE ROCK-N-ROLL!

Edited by - Metal_Fly on 12/20/2004 2:14:59 PM
Joined: 11/12/2003
Posts: 21852
Posted on Monday, December 20, 2004 2:19:00 PM
 
тебе обьязательно список на 20 обрезать ?
(можно ORDER BY использовать) , но я точно знаю что еше есть возможность заказать кол.во возврашеных строк.

Joined: 8/24/2004
Posts: 6087
Posted on Monday, December 20, 2004 2:21:00 PM
 
На PostgreSQL я бы написал что-то такое:


SELECT Message, Domain.Name, SUM(TotalSent)
FROM YourTable
INNER JOIN Domain ON YourTable.DomainID=Domain.ID
WHERE Domain.ID IN (SELECT D.ID FROM YourTable YT WHERE YT.Message=YourTable.Message GROUP BY YourTable.Message ORDER BY SUM(D.TotalSent) LIMIT 20)


Хотя не уверен честно говоря, что сервер не ругнется на подзапрос (там SUM(D.TotalSent нет во from clause, скорее всего будет ругаться).

--
KOHb a.k.a. AVL
Joined: 3/1/2002
Posts: 51165
Posted on Monday, December 20, 2004 2:23:00 PM
 
пианисты нах =)
Joined: 11/12/2003
Posts: 21852
Posted on Monday, December 20, 2004 2:24:00 PM
 
не... не руганется. все правила рациональной алгебры соблюдены :)
Joined: 11/16/2002
Posts: 9
Posted on Monday, December 20, 2004 2:27:00 PM
 

-- create table MessageTable (MessageID int, TotalSent int, Domain varchar(20))

select mt1.MessageID, mt1.Domain, mt1.TotalSent
from MessageTable as mt1
inner join MessageTable as mt2 on mt1.TotalSent ] mt2.TotalSent and mt1.MessageID=mt2.MessageID and mt1.Domain=mt2.Domain
group by mt1.MessageID, mt1.Domain, mt1.TotalSent
having count(*) [ 20
order by mt1.MessageID, mt1.Domain, mt1.TotalSent DESC
Joined: 8/24/2004
Posts: 6087
Posted on Monday, December 20, 2004 2:27:00 PM
 
Metal_Fly,

ну на T-SQL это очень просто - напиши stored procedure типа такой:

create proc P
as
begin
create table #t (
Message varchar(...),
DomainName varchar(...),
TotalSent
)
declare cursor #c as
select distinct Message
from YourTable
fetch...
while(...)
begin
fetch...
declare cursor #cc as
select Domain.Name, SUM(TotalSent)
from ...
n = 0
while(...)
begin
n++
if(n ]20)
break
end
end
close cursors & stuff
select * from #t order by whatever
end


С T-SQL давно не работал, но идея ясна, надеюсь. Если у микрософта появился аналог LIMIT clause, то лучше его заюзать, конечно.

--
KOHb a.k.a. AVL
Joined: 11/16/2002
Posts: 9
Posted on Monday, December 20, 2004 2:28:00 PM
 

"[" eto v smisle "less than"

"]" - eto "greater than"
Page: [1] 2 All
Forums » Archive » SQL query 
Copyright © 2020 Torontovka.com, All rights reserved