I am trying to write a sql query in which I want all the list of uid assigned under another uid from the below given table
uid rid assTo
1 1 NULL
2 2 1
3 1 2
6 11 3
7 11 1
17 11 1
18 11 1
19 11 1
21 11 1
22 2 1
23 11 22
24 2 22
25 10 24
26 10 24
27 11 26
28 11 26
29 10 24
30 11 3
31 11 29
32 11 29
33 11 29
34 11 29
35 11 29
36 11 29
37 11 29
38 11 29
39 11 29
40 11 29
41 11 29
47 11 2
48 11 2
50 11 26
51 11 2
52 11 26
53 11 29
55 11 1
56 11 1
57 11 652
68 11 652
70 11 652
71 11 652
72 11 2
74 1 1
75 11 2
76 11 652
80 11 652
86 11 652
87 11 1
88 11 26
89 11 29
I want all the list of uid assigned to another uid i.e. designated in assto column in above table
How can I implement it?
My query
select u1.assignto 'assignto',u2.userid 'userid'
from users u1 join users u2
on u1.assignto=u2.userid
My desired output is that when i search uid = 1
i should the list of the uid available in the above table.
IN solution:
select * from tablename
where uid in (select assTo from tablename)
Self JOIN solution:
select distinct t1.*
from tablename t1
JOIN tablename t2 ON t1.uid= t2.assTo
EXISTS solution (similar to IN):
select *
from tablename t1
where exists (select 1 from tablename t2
where t2.assTo = t1.uid)
Related
ER-diagram:
I am making a questionnaire application which asks the following:
Enter month
Type of inquiry (Phone, personal..)
Duration of the call
who is the supervisor
Study status
Which institution *
Study programme
Topic/category *
Where I need the answers marked with an asterisk from the database to insert into:
Datadesign
The table that I'm using is QuestionAnswer:
QuestionAnswerId
QuestionId
AnswerOptionId
FormularId
1
109
2
1
27
2
110
3
4
27
3
111
2
1
27
4
112
3
4
27
5
113
2
1
27
6
114
3
4
27
7
115
2
1
27
8
123
3
4
29
9
124
2
1
29
10
125
3
4
29
11
126
2
1
29
12
127
3
4
29
13
128
2
1
29
14
129
3
4
29
15
130
2
1
30
16
131
3
4
30
... continues
I have created a query that gives me only the AnswerOptionId's and QuestionId's I need
QuestionId = 6 (= departments), QuestionId = 8 (=topic) And AnswerOptionId = 13-17 (is the selected topic) and the AnswerOptionId = 69-89 (is the selected topic)
SELECT *
FROM QuestionAnswer
WHERE QuestionId = 6 AND
AnswerOptionId BETWEEN 13 AND 17
OR
QuestionId = 8 AND
AnswerOptionId BETWEEN 69 AND 89
ORDER BY FormularId
Where the result is:
QuestionAnswerId
QuestionId
AnswerOptionId
FormularId
1
290
6
15
52
2
292
8
78
52
3
347
6
15
61
4
349
8
80
61
5
354
6
15
62
6
356
8
87
62
... continues
And I want it to be like:
QuestionId
AnswerOptionId
QuestionId
AnswerOptionId
FormularId
1
6
15
8
78
52
2
6
15
8
80
61
3
6
15
8
87
62
... continues
I suggest querying for each question separately and then joining the results on the shared FormularId.
Something like:
SELECT
Q1.QuestionId, Q1.AnswerOptionId,
Q2.QuestionId, Q2.AnswerOptionId,
COALESCE(Q1.FormularId, Q2.FormularId) AS FormularId
FROM (
SELECT *
FROM QuestionAnswer
WHERE QuestionId = 6 AND
AnswerOptionId BETWEEN 13 AND 17
) Q1
FULL OUTER JOIN (
SELECT *
FROM QuestionAnswer
WHERE QuestionId = 8 AND
AnswerOptionId BETWEEN 69 AND 89
) Q2
ON Q2.FormularId = Q1.FormularId
ORDER BY FormularId
Result:
QuestionId
AnswerOptionId
QuestionId
AnswerOptionId
FormularId
6
15
8
78
52
6
15
8
80
61
6
15
8
87
62
See this db<>fiddle.
If, for a given FormularId, only one of the questions satisfies your criteria, the results will show nulls for the other question. If you only want to include cases where both questions satisfy your criteria, you can change the FULL OUTER JOIN to a regular (inner) JOIN.
I have a SQL Server table with a column price looking like this:
10
96
64
38
32
103
74
32
67
103
55
28
30
110
79
91
16
71
36
106
89
87
59
41
56
89
68
32
80
47
45
77
64
93
17
88
13
19
83
12
76
99
104
65
83
95
Now my aim is to create a new column giving a category from 1 to 10 to each of those values.
For instance the max value in my column is 110 the min is 10. Max-min = 100. Then if I want to have 10 categories I do 100/10= 10. Therefore here are the ranges:
10-20 1
21-30 2
31-40 3
41-50 4
51-60 5
61-70 6
71-80 7
81-90 8
91-100 9
101-110 10
Desired output:
my new column called cat should look like this:
price cat
-----------------
10 1
96 9
64 6
38 3
32 3
103 10
74 7
32 3
67 6
103 10
55 5
28 2
30 3
110 10
79 7
91 9
16 1
71 7
36 3
106 10
89 8
87 8
59 5
41 4
56 5
89 8
68 6
32 3
80 7
47 4
45 4
77 7
64 6
93 9
17 1
88 8
13 1
19 1
83 8
12 1
76 7
99 9
104 10
65 6
83 8
95 9
Is there a way to perform this with T-SQL? Sorry if this question is maybe too easy. I searched long time on the web. So either the problem is not as simple as I imagine. Either I entered the wrong keywords.
Yes, almost exactly as you describe the calculation:
select price,
1 + (price - min_price) * 10 / (max_price - min_price + 1) as decile
from (select price,
min(price) over () as min_price,
max(price) over () as max_price
from t
) t;
The 1 + is because you want the values from 1 to 10, rather than 0 to 9.
Yes - a case statement can do that.
select
price
,case
when price between 10 and 20 then 1
when price between 21 and 30 then 2
when price between 31 and 40 then 3
when price between 41 and 50 then 4
when price between 51 and 60 then 5
when price between 61 and 70 then 6
when price between 71 and 80 then 7
when price between 81 and 90 then 8
when price between 91 and 100 then 9
when price between 101 and 110 then 10
else null
end as cat
from [<enter your table name here>]
I have a table new_table
ID PROC_ID DEP_ID OLD_STAFF NEW_STAFF
1 15 43 58 ?
2 19 43 58 ?
3 29 43 58 ?
4 31 43 58 ?
5 35 43 58 ?
6 37 43 58 ?
7 38 43 58 ?
8 39 43 58 ?
9 58 43 58 ?
10 79 43 58 ?
How I can select all proc_ids and update new_staff, for example
ID PROC_ID DEP_ID OLD_STAFF NEW_STAFF
1 15 43 58 15
2 19 43 58 15
3 29 43 58 15
4 31 43 58 15
5 35 43 58 23
6 37 43 58 23
7 38 43 58 23
8 39 43 58 28
9 58 43 58 28
10 79 43 58 28
15 - 4(proc_id)
23 - 3(proc_id)
28 - 3(proc_id)
58 - is busi
where 15, 23, 28 and 58 staffs in one dep
"how to divide equal parts"
Oracle has a function, ntile() which splits a result set into equal buckets. For instance this query puts your posted data into four buckets:
SQL> select id
2 , proc_id
3 , ntile(4) over (order by id asc) as gen_staff
4 from new_table;
ID PROC_ID GEN_STAFF
---------- ---------- ----------
1 15 1
2 19 1
3 29 1
4 31 2
5 35 2
6 37 2
7 38 3
8 39 3
9 58 4
10 79 4
10 rows selected.
SQL>
This isn't quite the solution you want but you need to clarify your requirements before it's possible to provide a complete answer.
update new_table
set new_staff='15'
where ID in('1','2','3','4')
update new_table
set new_staff='28'
where ID in('8','9','10')
update new_table
set new_staff='23'
where ID in('5','6','7')
Not sure if this is what you mean.
I have a table with 3 columns. cid is the user, when is a timestamp of some transaction, and the 3rd column is me fumbling with how to achieve my objective.
In DB2, using this query:
SELECT cid, when, ROW_NUMBER() OVER (PARTITION BY cid ORDER BY when ASC) AS cid_when_rank
FROM (SELECT DISTINCT cid, when FROM yrb_purchase ORDER BY cid) AS temp
I get this table:
CID WHEN CID_WHEN_RANK
1 1999-04-20-12.12.00.000000 1
1 2001-12-01-11.59.00.000000 2
2 1998-08-08-17.33.00.000000 1
2 1999-02-13-15.13.00.000000 2
2 1999-04-16-11.46.00.000000 3
2 2001-02-23-12.37.00.000000 4
2 2001-04-24-17.02.00.000000 5
2 2001-10-21-11.05.00.000000 6
2 2001-12-01-15.39.00.000000 7
3 1998-01-27-09.19.00.000000 1
3 2001-10-06-11.12.00.000000 2
4 2000-06-13-09.45.00.000000 1
4 2001-06-30-13.58.00.000000 2
4 2001-08-11-17.40.00.000000 3
5 2001-07-17-16.27.00.000000 1
6 2000-05-18-11.43.00.000000 1
6 2001-07-08-18.09.00.000000 2
6 2001-10-02-12.37.00.000000 3
7 1999-06-15-12.13.00.000000 1
7 2000-05-05-14.49.00.000000 2
7 2000-09-26-16.32.00.000000 3
8 1999-01-19-09.32.00.000000 1
8 1999-08-02-09.20.00.000000 2
8 2000-07-03-12.39.00.000000 3
8 2001-08-13-13.11.00.000000 4
8 2001-10-18-10.18.00.000000 5
9 2001-09-10-13.03.00.000000 1
10 2000-03-11-10.05.00.000000 1
10 2001-03-11-15.46.00.000000 2
10 2001-04-29-18.30.00.000000 3
11 2001-07-27-11.45.00.000000 1
12 1999-02-07-10.59.00.000000 1
12 2001-08-24-11.12.00.000000 2
13 1998-03-17-14.04.00.000000 1
13 2001-05-18-10.11.00.000000 2
13 2001-09-14-12.56.00.000000 3
14 2001-10-10-17.18.00.000000 1
15 2000-12-01-18.27.00.000000 1
16 2000-01-04-14.18.00.000000 1
16 2001-02-27-15.08.00.000000 2
16 2001-11-16-09.52.00.000000 3
17 1998-04-08-17.59.00.000000 1
17 1999-06-07-10.13.00.000000 2
17 2001-09-13-12.08.00.000000 3
18 2001-09-22-10.01.00.000000 1
19 1999-03-09-12.11.00.000000 1
19 2001-07-23-09.27.00.000000 2
19 2001-12-01-16.10.00.000000 3
20 1999-11-22-14.29.00.000000 1
20 2000-05-27-17.56.00.000000 2
20 2001-06-01-09.37.00.000000 3
21 1998-02-17-16.08.00.000000 1
21 2000-02-15-13.22.00.000000 2
21 2001-03-10-15.05.00.000000 3
21 2001-03-10-16.22.00.000000 4
21 2001-10-25-10.15.00.000000 5
21 2001-11-19-11.02.00.000000 6
22 2001-03-04-17.13.00.000000 1
22 2001-08-16-16.59.00.000000 2
22 2001-10-23-11.24.00.000000 3
23 1998-07-04-16.33.00.000000 1
23 2000-09-26-13.17.00.000000 2
23 2000-09-27-12.27.00.000000 3
23 2001-06-23-16.45.00.000000 4
23 2001-10-27-18.01.00.000000 5
24 2001-10-23-14.59.00.000000 1
25 2001-03-14-09.26.00.000000 1
25 2001-11-30-14.23.00.000000 2
26 2001-04-27-15.07.00.000000 1
26 2001-06-30-11.26.00.000000 2
26 2001-12-01-18.04.00.000000 3
27 2000-06-05-09.44.00.000000 1
28 1999-07-17-10.14.00.000000 1
28 2001-02-03-15.50.00.000000 2
28 2001-02-13-12.08.00.000000 3
28 2001-07-20-16.52.00.000000 4
29 2001-06-10-17.16.00.000000 1
29 2001-09-20-10.19.00.000000 2
30 1999-05-22-16.59.00.000000 1
30 2001-10-20-15.28.00.000000 2
30 2001-12-01-14.50.00.000000 3
32 1999-05-05-14.20.00.000000 1
32 2000-05-12-13.51.00.000000 2
32 2001-05-18-10.43.00.000000 3
33 1999-02-07-18.58.00.000000 1
33 1999-09-30-14.05.00.000000 2
33 2001-09-18-12.48.00.000000 3
34 1999-05-29-15.57.00.000000 1
35 2001-03-19-18.38.00.000000 1
35 2001-03-28-15.49.00.000000 2
36 1999-06-22-11.42.00.000000 1
36 1999-10-30-15.25.00.000000 2
36 2000-01-27-10.17.00.000000 3
36 2000-11-04-09.06.00.000000 4
37 1999-01-11-09.51.00.000000 1
37 2000-11-25-17.53.00.000000 2
37 2000-12-01-17.21.00.000000 3
37 2001-10-21-16.49.00.000000 4
38 1997-10-11-17.15.00.000000 1
39 2000-03-09-13.46.00.000000 1
39 2001-01-09-16.22.00.000000 2
39 2001-07-03-14.12.00.000000 3
40 1998-07-27-17.39.00.000000 1
40 1999-01-27-09.36.00.000000 2
40 1999-06-12-17.18.00.000000 3
40 2000-05-17-14.17.00.000000 4
40 2001-04-08-15.39.00.000000 5
40 2001-09-30-10.26.00.000000 6
41 1998-06-05-10.06.00.000000 1
41 1998-08-23-09.39.00.000000 2
41 1999-12-01-18.42.00.000000 3
41 2001-03-30-15.26.00.000000 4
41 2001-11-15-15.33.00.000000 5
42 2000-06-22-12.16.00.000000 1
42 2001-01-13-15.03.00.000000 2
42 2001-08-19-14.18.00.000000 3
43 1998-07-07-11.29.00.000000 1
43 1999-01-22-15.46.00.000000 2
43 2000-08-04-12.16.00.000000 3
43 2001-03-17-14.18.00.000000 4
44 1999-11-03-09.32.00.000000 1
44 2001-05-26-17.23.00.000000 2
44 2001-07-18-12.59.00.000000 3
44 2001-10-23-10.04.00.000000 4
44 2001-11-09-16.18.00.000000 5
45 2000-03-19-10.31.00.000000 1
45 2001-07-14-11.36.00.000000 2
I am trying to eliminate all the customers (cid) who have made only one purchase. For example, cid=5 and cid=9 are good examples. The logic is that if they have a cid_when_rank=1, but no cid_when_rank=2, I need to drop those tuples. I have been breaking my head using INTERSECTION, EXCEPT, and using logic in the WHERE clause, but no luck. I looked online on how to eliminate DISTINCT records, but all I found was people discovering the DISTINCT keyword.
Please do not suggest hard coding cid=5 or cid=9 as there are more than those two records in the table.
Can you please suggest a simple SQL way to get this done. Please be aware I am not very strong at SQL yet, and would appreciate the most basic answer
Thanks in advance!
************************************EDIT #1**********************************
when I tried the first and second suggested answers my table went from 127 records to 287. I am trying to simply remove the records where a cid has a rank of 1, and does not have a rank of 2. Hope you can help.
The results of both suggested answers yield the same table:
CID WHEN CID_WHEN_RANK
1 1999-04-20-12.12.00.000000 1
1 2001-12-01-11.59.00.000000 2
1 2001-12-01-11.59.00.000000 3
1 2001-12-01-11.59.00.000000 4
1 2001-12-01-11.59.00.000000 5
2 1998-08-08-17.33.00.000000 1
2 1998-08-08-17.33.00.000000 2
2 1999-02-13-15.13.00.000000 3
2 1999-04-16-11.46.00.000000 4
2 2001-02-23-12.37.00.000000 5
2 2001-04-24-17.02.00.000000 6
2 2001-04-24-17.02.00.000000 7
2 2001-04-24-17.02.00.000000 8
2 2001-10-21-11.05.00.000000 9
2 2001-10-21-11.05.00.000000 10
2 2001-12-01-15.39.00.000000 11
3 1998-01-27-09.19.00.000000 1
3 1998-01-27-09.19.00.000000 2
3 1998-01-27-09.19.00.000000 3
3 2001-10-06-11.12.00.000000 4
3 2001-10-06-11.12.00.000000 5
3 2001-10-06-11.12.00.000000 6
3 2001-10-06-11.12.00.000000 7
3 2001-10-06-11.12.00.000000 8
4 2000-06-13-09.45.00.000000 1
4 2001-06-30-13.58.00.000000 2
4 2001-06-30-13.58.00.000000 3
4 2001-06-30-13.58.00.000000 4
4 2001-08-11-17.40.00.000000 5
5 2001-07-17-16.27.00.000000 1
5 2001-07-17-16.27.00.000000 2
5 2001-07-17-16.27.00.000000 3
5 2001-07-17-16.27.00.000000 4
5 2001-07-17-16.27.00.000000 5
5 2001-07-17-16.27.00.000000 6
5 2001-07-17-16.27.00.000000 7
6 2000-05-18-11.43.00.000000 1
6 2000-05-18-11.43.00.000000 2
6 2000-05-18-11.43.00.000000 3
6 2001-07-08-18.09.00.000000 4
6 2001-07-08-18.09.00.000000 5
6 2001-10-02-12.37.00.000000 6
7 1999-06-15-12.13.00.000000 1
7 1999-06-15-12.13.00.000000 2
7 2000-05-05-14.49.00.000000 3
7 2000-09-26-16.32.00.000000 4
8 1999-01-19-09.32.00.000000 1
8 1999-08-02-09.20.00.000000 2
8 2000-07-03-12.39.00.000000 3
8 2000-07-03-12.39.00.000000 4
8 2001-08-13-13.11.00.000000 5
8 2001-10-18-10.18.00.000000 6
8 2001-10-18-10.18.00.000000 7
9 2001-09-10-13.03.00.000000 1
9 2001-09-10-13.03.00.000000 2
9 2001-09-10-13.03.00.000000 3
9 2001-09-10-13.03.00.000000 4
9 2001-09-10-13.03.00.000000 5
9 2001-09-10-13.03.00.000000 6
9 2001-09-10-13.03.00.000000 7
9 2001-09-10-13.03.00.000000 8
10 2000-03-11-10.05.00.000000 1
10 2001-03-11-15.46.00.000000 2
10 2001-03-11-15.46.00.000000 3
10 2001-04-29-18.30.00.000000 4
10 2001-04-29-18.30.00.000000 5
11 2001-07-27-11.45.00.000000 1
11 2001-07-27-11.45.00.000000 2
11 2001-07-27-11.45.00.000000 3
11 2001-07-27-11.45.00.000000 4
11 2001-07-27-11.45.00.000000 5
12 1999-02-07-10.59.00.000000 1
12 2001-08-24-11.12.00.000000 2
12 2001-08-24-11.12.00.000000 3
12 2001-08-24-11.12.00.000000 4
13 1998-03-17-14.04.00.000000 1
13 2001-05-18-10.11.00.000000 2
13 2001-05-18-10.11.00.000000 3
13 2001-05-18-10.11.00.000000 4
13 2001-09-14-12.56.00.000000 5
14 2001-10-10-17.18.00.000000 1
14 2001-10-10-17.18.00.000000 2
14 2001-10-10-17.18.00.000000 3
14 2001-10-10-17.18.00.000000 4
14 2001-10-10-17.18.00.000000 5
14 2001-10-10-17.18.00.000000 6
14 2001-10-10-17.18.00.000000 7
14 2001-10-10-17.18.00.000000 8
15 2000-12-01-18.27.00.000000 1
15 2000-12-01-18.27.00.000000 2
15 2000-12-01-18.27.00.000000 3
15 2000-12-01-18.27.00.000000 4
15 2000-12-01-18.27.00.000000 5
16 2000-01-04-14.18.00.000000 1
16 2001-02-27-15.08.00.000000 2
16 2001-02-27-15.08.00.000000 3
16 2001-02-27-15.08.00.000000 4
16 2001-11-16-09.52.00.000000 5
16 2001-11-16-09.52.00.000000 6
16 2001-11-16-09.52.00.000000 7
17 1998-04-08-17.59.00.000000 1
17 1999-06-07-10.13.00.000000 2
17 2001-09-13-12.08.00.000000 3
17 2001-09-13-12.08.00.000000 4
17 2001-09-13-12.08.00.000000 5
18 2001-09-22-10.01.00.000000 1
18 2001-09-22-10.01.00.000000 2
18 2001-09-22-10.01.00.000000 3
19 1999-03-09-12.11.00.000000 1
19 1999-03-09-12.11.00.000000 2
19 1999-03-09-12.11.00.000000 3
19 2001-07-23-09.27.00.000000 4
19 2001-07-23-09.27.00.000000 5
19 2001-07-23-09.27.00.000000 6
19 2001-12-01-16.10.00.000000 7
19 2001-12-01-16.10.00.000000 8
19 2001-12-01-16.10.00.000000 9
19 2001-12-01-16.10.00.000000 10
19 2001-12-01-16.10.00.000000 11
20 1999-11-22-14.29.00.000000 1
20 1999-11-22-14.29.00.000000 2
20 2000-05-27-17.56.00.000000 3
20 2001-06-01-09.37.00.000000 4
20 2001-06-01-09.37.00.000000 5
21 1998-02-17-16.08.00.000000 1
21 2000-02-15-13.22.00.000000 2
21 2001-03-10-15.05.00.000000 3
21 2001-03-10-15.05.00.000000 4
21 2001-03-10-15.05.00.000000 5
21 2001-03-10-16.22.00.000000 6
21 2001-10-25-10.15.00.000000 7
21 2001-11-19-11.02.00.000000 8
21 2001-11-19-11.02.00.000000 9
21 2001-11-19-11.02.00.000000 10
21 2001-11-19-11.02.00.000000 11
22 2001-03-04-17.13.00.000000 1
22 2001-03-04-17.13.00.000000 2
22 2001-03-04-17.13.00.000000 3
22 2001-03-04-17.13.00.000000 4
22 2001-08-16-16.59.00.000000 5
22 2001-10-23-11.24.00.000000 6
23 1998-07-04-16.33.00.000000 1
23 2000-09-26-13.17.00.000000 2
23 2000-09-26-13.17.00.000000 3
23 2000-09-27-12.27.00.000000 4
23 2000-09-27-12.27.00.000000 5
23 2001-06-23-16.45.00.000000 6
23 2001-06-23-16.45.00.000000 7
23 2001-10-27-18.01.00.000000 8
23 2001-10-27-18.01.00.000000 9
23 2001-10-27-18.01.00.000000 10
23 2001-10-27-18.01.00.000000 11
24 2001-10-23-14.59.00.000000 1
24 2001-10-23-14.59.00.000000 2
24 2001-10-23-14.59.00.000000 3
25 2001-03-14-09.26.00.000000 1
25 2001-03-14-09.26.00.000000 2
25 2001-03-14-09.26.00.000000 3
25 2001-11-30-14.23.00.000000 4
26 2001-04-27-15.07.00.000000 1
26 2001-04-27-15.07.00.000000 2
26 2001-04-27-15.07.00.000000 3
26 2001-04-27-15.07.00.000000 4
26 2001-04-27-15.07.00.000000 5
26 2001-06-30-11.26.00.000000 6
26 2001-06-30-11.26.00.000000 7
26 2001-06-30-11.26.00.000000 8
26 2001-12-01-18.04.00.000000 9
26 2001-12-01-18.04.00.000000 10
26 2001-12-01-18.04.00.000000 11
27 2000-06-05-09.44.00.000000 1
27 2000-06-05-09.44.00.000000 2
28 1999-07-17-10.14.00.000000 1
28 2001-02-03-15.50.00.000000 2
28 2001-02-03-15.50.00.000000 3
28 2001-02-03-15.50.00.000000 4
28 2001-02-13-12.08.00.000000 5
28 2001-02-13-12.08.00.000000 6
28 2001-07-20-16.52.00.000000 7
28 2001-07-20-16.52.00.000000 8
29 2001-06-10-17.16.00.000000 1
29 2001-06-10-17.16.00.000000 2
29 2001-06-10-17.16.00.000000 3
29 2001-09-20-10.19.00.000000 4
29 2001-09-20-10.19.00.000000 5
29 2001-09-20-10.19.00.000000 6
30 1999-05-22-16.59.00.000000 1
30 2001-10-20-15.28.00.000000 2
30 2001-10-20-15.28.00.000000 3
30 2001-10-20-15.28.00.000000 4
30 2001-10-20-15.28.00.000000 5
30 2001-12-01-14.50.00.000000 6
30 2001-12-01-14.50.00.000000 7
32 1999-05-05-14.20.00.000000 1
32 1999-05-05-14.20.00.000000 2
32 2000-05-12-13.51.00.000000 3
32 2001-05-18-10.43.00.000000 4
32 2001-05-18-10.43.00.000000 5
32 2001-05-18-10.43.00.000000 6
32 2001-05-18-10.43.00.000000 7
32 2001-05-18-10.43.00.000000 8
33 1999-02-07-18.58.00.000000 1
33 1999-02-07-18.58.00.000000 2
33 1999-02-07-18.58.00.000000 3
33 1999-09-30-14.05.00.000000 4
33 1999-09-30-14.05.00.000000 5
33 1999-09-30-14.05.00.000000 6
33 2001-09-18-12.48.00.000000 7
33 2001-09-18-12.48.00.000000 8
34 1999-05-29-15.57.00.000000 1
34 1999-05-29-15.57.00.000000 2
35 2001-03-19-18.38.00.000000 1
35 2001-03-19-18.38.00.000000 2
35 2001-03-28-15.49.00.000000 3
35 2001-03-28-15.49.00.000000 4
36 1999-06-22-11.42.00.000000 1
36 1999-10-30-15.25.00.000000 2
36 1999-10-30-15.25.00.000000 3
36 1999-10-30-15.25.00.000000 4
36 2000-01-27-10.17.00.000000 5
36 2000-11-04-09.06.00.000000 6
37 1999-01-11-09.51.00.000000 1
37 1999-01-11-09.51.00.000000 2
37 1999-01-11-09.51.00.000000 3
37 2000-11-25-17.53.00.000000 4
37 2000-11-25-17.53.00.000000 5
37 2000-12-01-17.21.00.000000 6
37 2000-12-01-17.21.00.000000 7
37 2001-10-21-16.49.00.000000 8
38 1997-10-11-17.15.00.000000 1
38 1997-10-11-17.15.00.000000 2
38 1997-10-11-17.15.00.000000 3
38 1997-10-11-17.15.00.000000 4
38 1997-10-11-17.15.00.000000 5
38 1997-10-11-17.15.00.000000 6
39 2000-03-09-13.46.00.000000 1
39 2000-03-09-13.46.00.000000 2
39 2001-01-09-16.22.00.000000 3
39 2001-01-09-16.22.00.000000 4
39 2001-01-09-16.22.00.000000 5
39 2001-01-09-16.22.00.000000 6
39 2001-07-03-14.12.00.000000 7
40 1998-07-27-17.39.00.000000 1
40 1999-01-27-09.36.00.000000 2
40 1999-06-12-17.18.00.000000 3
40 1999-06-12-17.18.00.000000 4
40 2000-05-17-14.17.00.000000 5
40 2001-04-08-15.39.00.000000 6
40 2001-09-30-10.26.00.000000 7
40 2001-09-30-10.26.00.000000 8
41 1998-06-05-10.06.00.000000 1
41 1998-06-05-10.06.00.000000 2
41 1998-06-05-10.06.00.000000 3
41 1998-08-23-09.39.00.000000 4
41 1998-08-23-09.39.00.000000 5
41 1999-12-01-18.42.00.000000 6
41 1999-12-01-18.42.00.000000 7
41 1999-12-01-18.42.00.000000 8
41 2001-03-30-15.26.00.000000 9
41 2001-03-30-15.26.00.000000 10
41 2001-11-15-15.33.00.000000 11
42 2000-06-22-12.16.00.000000 1
42 2000-06-22-12.16.00.000000 2
42 2001-01-13-15.03.00.000000 3
42 2001-01-13-15.03.00.000000 4
42 2001-08-19-14.18.00.000000 5
42 2001-08-19-14.18.00.000000 6
42 2001-08-19-14.18.00.000000 7
42 2001-08-19-14.18.00.000000 8
43 1998-07-07-11.29.00.000000 1
43 1999-01-22-15.46.00.000000 2
43 2000-08-04-12.16.00.000000 3
43 2001-03-17-14.18.00.000000 4
43 2001-03-17-14.18.00.000000 5
43 2001-03-17-14.18.00.000000 6
44 1999-11-03-09.32.00.000000 1
44 2001-05-26-17.23.00.000000 2
44 2001-07-18-12.59.00.000000 3
44 2001-10-23-10.04.00.000000 4
44 2001-10-23-10.04.00.000000 5
44 2001-10-23-10.04.00.000000 6
44 2001-10-23-10.04.00.000000 7
44 2001-11-09-16.18.00.000000 8
45 2000-03-19-10.31.00.000000 1
45 2000-03-19-10.31.00.000000 2
45 2000-03-19-10.31.00.000000 3
45 2001-07-14-11.36.00.000000 4
287 record(s) selected.
Any suggestions?
You can use the count window function to fetch cid's when they have more than 1 row.
select cid,when,cid_when_rank
from (
SELECT cid, when, ROW_NUMBER() OVER(PARTITION BY cid ORDER BY when ASC) AS cid_when_rank
,COUNT(*) OVER(PARTITION BY cid) as cnt
FROM yrb_purchase
) t
where cnt > 1
Edit: Based on OP's comment,
select cid,when,cid_when_rank
from (
SELECT cid, when, ROW_NUMBER() OVER(PARTITION BY cid ORDER BY when ASC) AS cid_when_rank
,COUNT(*) OVER(PARTITION BY cid) as cnt
FROM (SELECT DISTINCT cid, when FROM yrb_purchase) tmp
) t
where cnt > 1
Using count(*) as a window function is a very good solution. One way that might return results faster is exists:
select p.*
from yrb_purchase p
where exists (select 1 from yrb_purchase p2 where p2.when <> p.when);
Of course, if you need the row number as well, then the overhead for the count is probably immeasurable.
I want to insert a page_number in a record that continuously count base on duplicate in a column. example output:
ID PAGE_ORDER PAGE_NUMBER
1 7 1
2 7 1
3 7 1
4 7 1
5 7 1
6 10 2
7 10 2
8 10 2
9 10 2
10 10 2
11 13 3
12 13 3
13 13 3
14 13 3
15 13 3
16 9 4
17 9 4
18 9 4
19 9 4
20 9 4
21 16 5
22 16 5
23 16 5
24 16 5
25 16 5
26 11 6
27 11 6
28 11 6
29 11 6
30 11 6
31 12 7
32 12 7
33 12 7
34 12 7
35 12 7
36 4 8
37 4 8
38 4 8
39 4 8
40 4 8
41 5 9
42 5 9
43 5 9
44 5 9
45 5 9
46 14 10
47 14 10
48 14 10
49 14 10
50 14 10
51 15 11
52 15 11
53 15 11
54 15 11
55 15 11
56 6 12
57 6 12
58 6 12
59 6 12
60 6 12
61 1 13
62 1 13
63 1 13
64 1 13
65 1 13
66 2 14
67 2 14
68 2 14
69 2 14
70 2 14
71 8 15
72 8 15
73 8 15
74 8 15
75 8 15
76 3 16
77 3 16
78 3 16
79 3 16
80 3 16
How can I add the page_number column just like in the output?
The rule of page_number column is to count continuously base on duplicate records in page_order column.
Please advice. Thank you.
I found the solution in my problem:
select *, dense_rank() over (order by sort)
from (select *, sort = min(ID) over (partition by page_order)
from #tbl) c
order by c.ID
Thanks to KH Tan in msdn forums.
http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/55a18861-50a1-4f8a-b6f7-16992fa51e94
Thank you Guys!
I'm not really sure how your data is ordered - there seems to be lots of duplicates in no particular order.
However, if you're on SQL Server 2005 or 2008, your solution will probably involve RANK
http://msdn.microsoft.com/en-us/library/ms176102.aspx
I'm a bit unclear on what to do with the ID column since it's always the same value, but this should give you the output you want given the data you provided:
WITH Results AS (
SELECT
MAX(ID) as ID,
Page_Order,
ROW_NUMBER() OVER (ORDER BY Page_Order DESC) as Page_Number
FROM
PageNumberTable
GROUP BY
Page_Order
)
SELECT
Results.*
FROM
PageNumberTable
JOIN Results ON PageNumberTable.Page_Order = Results.Page_Order
Try this
SELECT id, page_order,
DENSE_RANK() OVER(ORDER BY
(MIN(id) OVER(PARTITION BY page_order)) as page_number
FROM table_name
ORDER BY id
edit: try this instead
;WITH T1 AS
(
SELECT id, page_order, MIN(id) OVER(PARTITION BY page_order) AS min_id
)
SELECT id, page_order, DENSE_RANK() OVER(ORDER BY min_id) AS page_number
FROM T1
ORDER BY id