![]() |
|
|
| Subject:
SQL Challenge
Category: Computers > Algorithms Asked by: alekb-ga List Price: $25.00 |
Posted:
03 Oct 2002 13:51 PDT
Expires: 02 Nov 2002 12:51 PST Question ID: 72167 |
|
| There is no answer at this time. |
|
| Subject:
Re: SQL Challenge
From: yusaku-ga on 03 Oct 2002 19:01 PDT |
I think that it is not possible under SQL in any easy way, but somethink like this should work (not tested - I have the syntax often wrong without checking it at a server...; and it DEFINITELLY will not be fast) create view a select * from sourcetbl; (naming mess...) create view v_Fashion_Starters select (select fashion_id from a where a.name=sourcetbl.name, a.wear_date=sourcetbl.wear_date, a.shirt=sourcetbl.shirt, a.tie=sourcetbl.tie TOP 1) as fashion_id, name, wear_date, shirt, tie, (select fashion_score from a where a.name=sourcetbl.name, a.wear_date=sourcetbl.wear_date, a.shirt=sourcetbl.shirt, a.tie=sourcetbl.tie TOP 1) as fashion_score from sourcetbl group by name, wear_date, shirt, tie; Anyway - do NOT do this. If at all possible, use some averaging functions like create view aaaa select min(fashion_id) as fashion_id, name, wear_date, shirt, tie, min(fashion_score) as fashion_score from sourcetbl group by name, wear_date, shirt, tie; |
| Subject:
Re: SQL Challenge
From: tds-ga on 11 Oct 2002 10:03 PDT |
Try this:
CREATE VIEW v_Fashion_Starters AS
SELECT fashion_id, name, wear_date, shirt, tie, fashion_score
FROM fashion_score fs
WHERE NOT EXISTS ( select wear_date, shirt, tie
from fashion_score fs2
where fs2.shirt = fs.shirt
and fs2.tie = fs.tie
and fs2.wear_date < fs.wear_date )
What this query says is: "Give me all the rows in this table that, for
a given combination of shirt and tie, are the first row in this table
(by wear_date) to contain that combination." More correctly, it says
"Give me all the rows in this table that, for a given combination of
shirt and tie, there are no other rows that have a wear_date earlier
than this one."
Let me know if this works for you. |
| Subject:
Re: SQL Challenge
From: nyura6-ga on 11 Oct 2002 21:58 PDT |
This method is fine, except if two people wore the same thing on the same first day, it will give you both of them. If you want to make sure there is just one "fashion-starter" per fashion, you can try some string tricks. I don't know if SQL Server 2000 has a tokenizer string function. If it does, you can do CREATE VIEW v_Fashion_Starters as SELECT shirt, tie, token(date_name_id_score, '~', 1) as date, token(date_name_id_score, '~', 2) as name, token(date_name_id_score, '~', 1) as fashion_id, token(date_name_id_score, '~', 1) as fashion_score FROM (SELECT shirt, tie, min(date||'~'||name||'~'||fashion_id||'~'||fashion_score) as date_name_id_score FROM Fashions GROUP BY shirt, tie) |
| Subject:
Re: SQL Challenge
From: alekb-ga on 13 Oct 2002 07:55 PDT |
tds, thanks for your comment. However, I don't think your solution is completely correct. According to the view you suggest in Example 1 (original question above) the following row would not be returned: 4 Bill 2002-01-07 blue red 7 The problem is not being able to specify the wear_date conditions in the subquery. |
| Subject:
Re: SQL Challenge
From: mathtalk-ga on 27 Oct 2002 19:18 PST |
It is not possible to do this with a View. A View is in principle
just like a table; it consists (virtually) of a definite set of rows,
out of which the SQL SELECT statement can filter records, etc.
You ask that WHERE clause conditions on the View be recognized as
parameters to the underlying CREATE VIEW statement, e.g. that weaker
restrictions on wear_date might exclude a row (because of the
existence of an even earlier record satisfying the weakened
restrictions).
If we ignore the CREATE VIEW part of your problem, then you are left
with the need to produce a parameterized SQL query. It is possible to
do what you want with a SQL query, rather than with a stored
procedure, but the wear_date_begin and wear_date_end parameters will
need to appear in the constructed query more than once. I'm not sure
of your intended application, but it is common to construct query
strings for transmittal to SQL Server 2000 "on the fly" using either
ODBC or ADO/OLE DB connections. [This was for a long time critical
with Oracle connections using ADO, because of a bug/limitation in
returning record sets from stored procedures ("packages") in Oracle.]
Let me know if further details of this would be the basis of a
satisfactory answer for you.
regards, mathtalk-ga |
| Subject:
Re: SQL Challenge
From: cleith-ga on 27 Oct 2002 23:18 PST |
Create View 1 using only the Name, Date, Shirt, and Tie filtered by the date range parameter. View 1 should be an agregation query with the Minimum parameter on the Date. Then create a second View 2 using View 1 joined against the original Table 1 using the Name and Date as the relationship and set as an equal join. Only show those records were the values exist on both sides of the join. View 2 should include the T1.Fashion_id, V1.Name, V1.Data, V1.Shirt, V1.Tie, and T1.Fashion_Score This should work. Thanks, cleith |
| Subject:
Re: SQL Challenge
From: davedave-ga on 30 Oct 2002 00:17 PST |
-- It's very ugly, but try cutting/pasting this into SQL Query
Analyzer
-- The trick is to get a list of the original data combined with all
possible search criteria.
create table Fashion (
fashion_id int,
name varchar(20),
wear_date datetime,
shirt varchar(20),
tie varchar(20),
fashion_score int
)
go
insert into Fashion select 1, 'Bill', '2002-01-01', 'blue',
'red', 3
insert into Fashion select 2, 'Bob', '2002-01-04', 'blue',
'white', 5
insert into Fashion select 3, 'Bill', '2002-01-05', 'green',
'red', 4
insert into Fashion select 4, 'Bill', '2002-01-07', 'blue',
'red', 7
insert into Fashion select 5, 'Bob', '2002-01-10', 'blue',
'red', 2
insert into Fashion select 6, 'Bill', '2002-01-10', 'green',
'red', 2
insert into Fashion select 7, 'Bill', '2002-01-11', 'green',
'red', 9
go
create view vDates as
select date = convert(datetime, '2002-01-01')
union select convert(datetime, '2002-01-02')
union select convert(datetime, '2002-01-03')
union select convert(datetime, '2002-01-04')
union select convert(datetime, '2002-01-05')
union select convert(datetime, '2002-01-06')
union select convert(datetime, '2002-01-07')
union select convert(datetime, '2002-01-08')
union select convert(datetime, '2002-01-09')
union select convert(datetime, '2002-01-10')
union select convert(datetime, '2002-01-11')
go
create view v_Fashion_Starters as
select f.*, fw.FilterDateFrom, fw.FilterDateTo
from (
select FirstWearDate = min(f.wear_date), FilterDateFrom = df.Date,
FilterDateTo = dt.Date, f.Name, f.Shirt, f.Tie
from Fashion f
inner join vDates df on f.wear_date >= df.date
inner join vDates dt on f.wear_date <= dt.date
group by df.Date, dt.Date, f.Name, f.Shirt, f.Tie
) as fw
inner join Fashion f on fw.FirstWearDate = f.Wear_Date
and fw.Name = f.Name
and fw.Shirt = f.Shirt
and fw.Tie = f.Tie
go
SELECT *
FROM v_Fashion_Starters
WHERE FilterDateFrom = '2002-01-04'
AND FilterDateTo = '2002-01-11'
SELECT *
FROM v_Fashion_Starters
WHERE FilterDateFrom = '2002-01-01'
AND FilterDateTo = '2002-01-11'
AND Name = 'Bill'
go
drop table Fashion
drop view vDates
drop view v_Fashion_Starters
go |
| Subject:
Re: SQL Challenge
From: davedave-ga on 31 Oct 2002 07:14 PST |
Your version of the vDates definition restricts you to searching only on dates that happen to appear in the Fashion table. My vDates view allows you to search on any date range that appears in the view. Note: rather than a view with a bunch of silly "union selects", you should probably make a Dates table. Note 2: you can't pay me -- I was just looking at google answers for fun and saw a challenge. |
| Subject:
Re: SQL Challenge
From: iso8601-ga on 31 Oct 2002 16:53 PST |
Nice to see ISO 8601 style dates (2002-10-31) in use in a Real World Application. There is now an entire Google Directory Category devoted to the topic. |
If you feel that you have found inappropriate content, please let us know by emailing us at answers-support@google.com with the question ID listed above. Thank you. |
| Search Google Answers for |
| Google Home - Answers FAQ - Terms of Service - Privacy Policy |