Avatar billede Npinv Nybegynder
13. januar 2011 - 12:52 Der er 23 kommentarer og
2 løsninger

Select 10 records

Jeg har en række data, som jeg skal have selected fra en MSSQL database.
Jeg skal kun bruge 10 rækker.
Eks.:
3
4
5
6
7
10
11
12
13
14
24
25
26
27
28
31

Jeg skal bruge første og sidste tal. Altså 3 og 31, og så 8 af de andre tal. Kan det lade sig gøre? SELECT TOP 10 X from X giver mig jo ikke rigtig et brugbart resultat i denne situation...

Det er datoer, hvor jeg har frasorteret alt andet end dagen, og de skal bruges i en graf, hvor der kun er plads til 10 pejlemærker. Bruger Google's graf API, hvis det skulle have interesse.
Avatar billede Npinv Nybegynder
13. januar 2011 - 12:53 #1
Min select ser pt. således ud:
SELECT DAY([timestamp]) AS timestamp_day, MONTH([timestamp]) AS timestamp_month FROM Portfolio_history
WHERE MONTH([timestamp]) = MONTH(GETDATE())
GROUP BY DAY([timestamp]), MONTH([timestamp])
Avatar billede michael_stim Ekspert
13. januar 2011 - 13:02 #2
min() og max() giver dig hhv størst og mindst.
Avatar billede Npinv Nybegynder
13. januar 2011 - 13:06 #3
Ok, og så kan man måske bruge noget rand() til de 8 andre tal, indsætte hele skidtet i en tmp tabel, og selecte fra den?
Avatar billede michael_stim Ekspert
13. januar 2011 - 13:07 #4
Ved ikke om det er nødvendigt med en tmp tabel. Kommer an på hvad du skal bruge det til og hvordan du hiver det ud.
Avatar billede Npinv Nybegynder
13. januar 2011 - 13:13 #5
Hvordan jeg hiver det ud, og hvad jeg skal bruge det til, står jo forklaret ovenfor?
Avatar billede Npinv Nybegynder
13. januar 2011 - 13:22 #6
CREATE TABLE timestamptmp (timestamp_day int)
insert into timestamptmp (timestamp_day) SELECT min(DAY([timestamp])) FROM Portfolio_history WHERE MONTH([timestamp]) = MONTH(GETDATE())
insert into timestamptmp (timestamp_day) SELECT max(DAY([timestamp])) FROM Portfolio_history WHERE MONTH([timestamp]) = MONTH(GETDATE())
insert into timestamptmp (timestamp_day) SELECT top 8 DAY([timestamp]) FROM Portfolio_history WHERE MONTH([timestamp]) = MONTH(GETDATE()) AND DAY([timestamp]) not in (select * from timestamptmp) GROUP BY DAY([timestamp])
select * from timestamptmp order by timestamp_day asc
drop table timestamptmp

Dette virker som sådan efter hensigten, bortset fra at de midterste tal ikke er "random". De er sorteret ascending, men jeg ville gerne have at den tog dem lidt mere gennemsnitligt eller hvad man skal kalde det... 
Der må næsten være en lettere måde at hente det ud på?
Avatar billede michael_stim Ekspert
13. januar 2011 - 13:29 #7
rand()

INSERT INTO table(row1, row2,....) SELECT min(), max(), rand()....
Avatar billede michael_stim Ekspert
13. januar 2011 - 13:35 #8
http://www.sqlusa.com/bestpractices2005/createemptytable/

Måske noget du kan bruge? Har ikke kigget det igennem, men så noget med ORDER BY newid.

Men leg lidt med det.
Avatar billede Npinv Nybegynder
13. januar 2011 - 13:43 #9
Problemet med rand og newid er, at så bliver resultatet forskelligt ved hvert udtræk. Det er ikke så hensigtsmæssigt når det skal bruges til en graf...
Avatar billede michael_stim Ekspert
13. januar 2011 - 13:46 #10
min(top5(...)), max(top5(...))?
Avatar billede michael_stim Ekspert
13. januar 2011 - 13:48 #11
Ved ikke om det kan lade sig gøre på den måde. top 5(min())...

Har ikke siddet med MSSQL, mest Oracle. Ellers må man kunne lave en stored procedure eller sådan noget.
Avatar billede Npinv Nybegynder
13. januar 2011 - 13:52 #12
Det kan man ikke, den henter tilsyneladende kun 1 række når man bruger min og max.
Avatar billede Npinv Nybegynder
13. januar 2011 - 13:54 #13
Noget helt andet er, at man så får et hul på 5 i midten af talrækken. Det skulle jo helst spredes ud.
Avatar billede michael_stim Ekspert
13. januar 2011 - 14:01 #14
Så bliver det jo ganske statisk, så kan du lige så godt hardcode det ind i din graf. Rand er mit bedste bud.
Avatar billede Npinv Nybegynder
13. januar 2011 - 14:09 #15
Arh, ikke helt. For dagene er ikke de samme i hver måned, i det at det kun er hverdage. Desuden er der på den første hverdag i måneden kun 1 dag at vise, og så kommer der jo flere og flere...
Ellers ville det være smart bare at lave det statisk...
Avatar billede Npinv Nybegynder
13. januar 2011 - 14:32 #16
Jeg har fundet noget her, men jeg forstår dog ikke helt hvordan det skal skrues sammen:

"I have done this on my ReHash Database Statistics chart (even though the dates turned out to be evenly spaced, so it doesn't exactly demonstrate that it's doing this).

First, you want to get your overall time period, which will be analogous to the overall width of your chart. To do this we subtract the earliest date from the latest. I prefer to use Unix-epoch timestamps as they are integers and easy to compare in this way, but you could easily calculate the number of seconds, etc.

Now, loop through your data. For each date we want the percentile in the overall period that the date is from the beginning (i.e. the earliest date is 0, the latest is 100). For each date, you first want to calculate the distance of the present date from the earliest date in the data set. Essentially, "how far are we from the start". So, subtract the earliest date from the present date. Then, to find the percentile, we divide the distance of the present date by the overall time period, and then multiply by 100 and truncate or round any decimal to give our integral x-coordinate.

And it is as simple as that! Your x-values will range from 0 (the left-side of the chart) to 100 (the right side) and each data point will lie at a distance from the start respective of it's true temporal distance.

If you have any questions, feel free to ask! I can post pesudocode or PHP if desired."

http://stackoverflow.com/questions/1020061/how-to-use-dates-in-x-axis-with-google-chart-api
Avatar billede kluns Nybegynder
13. januar 2011 - 18:20 #17
Hej

Kan du ikke lave noget med
SELECT TOP 10 bla,bla
og så runde det hele af med
ORDER BY CASE DAY(Timestamp) WHEN 1 THEN 1 WHEN 31 THEN 2 ELSE 3 END
Avatar billede kluns Nybegynder
13. januar 2011 - 18:25 #18
mente
ORDER BY CASE DAY(Timestamp) WHEN 3 THEN 1 WHEN 31 THEN 2 ELSE 3 END
Avatar billede arne_v Ekspert
14. januar 2011 - 03:26 #19
Til inspiration:

1> DROP TABLE t
2> go
1> CREATE TABLE t (
2>    v INTEGER NOT NULL,
3>    PRIMARY KEY(v)
4> )
5> GO
1>
2> INSERT INTO t VALUES(3)
3> GO
(1 row affected)
1> INSERT INTO t VALUES(4)
2> GO
(1 row affected)
1> INSERT INTO t VALUES(5)
2> GO
(1 row affected)
1> INSERT INTO t VALUES(6)
2> GO
(1 row affected)
1> INSERT INTO t VALUES(7)
2> GO
(1 row affected)
1> INSERT INTO t VALUES(10)
2> GO
(1 row affected)
1> INSERT INTO t VALUES(11)
2> GO
(1 row affected)
1> INSERT INTO t VALUES(12)
2> GO
(1 row affected)
1> INSERT INTO t VALUES(13)
2> GO
(1 row affected)
1> INSERT INTO t VALUES(14)
2> GO
(1 row affected)
1> INSERT INTO t VALUES(24)
2> GO
(1 row affected)
1> INSERT INTO t VALUES(25)
2> GO
(1 row affected)
1> INSERT INTO t VALUES(26)
2> GO
(1 row affected)
1> INSERT INTO t VALUES(27)
2> GO
(1 row affected)
1> INSERT INTO t VALUES(28)
2> GO
(1 row affected)
1> INSERT INTO t VALUES(31)
2> GO
(1 row affected)
1>
2> SELECT * FROM t
3> GO
v
-----------
          3
          4
          5
          6
          7
          10
          11
          12
          13
          14
          24
          25
          26
          27
          28
          31

(16 rows affected)
1>
2> SELECT MIN(v) AS z FROM t
3> UNION
4> SELECT * FROM (SELECT TOP 8 v AS z FROM t WHERE v NOT IN (SELECT MIN(v) FROM
t) AND v NOT IN (SELECT MAX(v) FROM t) ORDER BY CAST(SQRT(524287*v) AS INTEGER)%
31) x
5> UNION
6> SELECT MAX(v) AS z FROM t
7> ORDER BY z
8> GO
z
-----------
          3
          5
          6
          11
          13
          14
          24
          26
          27
          31

(10 rows affected)
1>
2> DROP TABLE t
3> GO
Avatar billede michael_stim Ekspert
14. januar 2011 - 11:14 #20
Hvad gør denne Arne:

CAST(SQRT(524287*v) AS INTEGER)%
31)

Kan godt se at den kører en modulus 31 på kvadratroden af 524287*v, men kan ikke lige gennemskue funktionaliteten.
Avatar billede arne_v Ekspert
14. januar 2011 - 15:30 #21
Maalsaetningen er at mappe alle vaerdier af v til en "tilfaeldig" vaerdi 0..30 og saa tage de 8 foerste sorteret efter den vaerdi.

Paastanden er at der ikke er nogen indlysende sammenhaeng mellem v og CAST(SQRT(524287*v) AS INTEGER)%31.

En matematiker med ekspertise i den slags kan sikkert bevise at fordelingen af tal ikke har super gode egenskaber som tilfaeldige.

Men saadan rent praktisk synes jeg at resultatet ser rimeligt ud.
Avatar billede Npinv Nybegynder
26. januar 2011 - 14:34 #22
Arne_v
Den ser ud til at fungere, men den er bare meget lang tid om at køre det.. Det duer jo ikke rigtig, hvis nu der er mange besøgende på siden. Så vil den jo være alt for længe om det...
Avatar billede arne_v Ekspert
27. januar 2011 - 01:36 #23
Det er ikke en særlig database venlig operation.

Hvis du kunne overlade det til din applikation så ville det være meget hurtigere.
Avatar billede Npinv Nybegynder
28. januar 2011 - 13:41 #24
Jeg har droppet den her idé, det fungerer sgu ikke rigtig.
Men tak for jeres tid...
Er det ikke  mest fair, at i deler point?
Avatar billede arne_v Ekspert
28. januar 2011 - 16:52 #25
Helt fint.

Her er et svar fra mig.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester