I'm trying to create a new column in a SELECT statement that picks out top level lines from withing the same table.
SAMPLE DATA:
ITEM_VALUE DESCRIPTION LEVEL_NO ITEM_ABOVE
100 Ford 3 CAR
200 Honda Own 3 CAR
210 Honda 3rd Party 3 CAR
1000 Ford 4 100
2000 Honda T Own 4 200
801 Ford 1 4 1000
802 Ford 2 4 1000
803 Ford 3 4 1000
804 Ford 4 4 1000
805 Ford 5 4 1000
806 Ford 6 4 1000
807 Ford 7 4 1000
808 Ford 8 4 1000
814 Ford 4 1000
809 Honda 4 2000
2100 Honda T 3rd Party 4 210
EXPECTED OUTPUT:
DESCRIPTION ITEM_GROUP
Ford Ford
Honda Own Honda Own
Honda 3rd Party Honda 3rd Party
Ford Ford
Honda T Own Honda Own
Ford 1 Ford
Ford 2 Ford
Ford 3 Ford
Ford 4 Ford
Ford 5 Ford
Ford 6 Ford
Ford 7 Ford
Ford 8 Ford
Ford Ford
Honda Honda Own
Honda T 3rd Party Honda 3rd Party
You can use a Recursive CTE:
WITH CTE(ITEM_VALUE, ITEM_ABOVE, DESCRIPTION, ITEM_GROUP) AS
(
SELECT ITEM_VALUE, ITEM_ABOVE, DESCRIPTION, DESCRIPTION AS ITEM_GROUP
FROM mytable
WHERE ITEM_ABOVE = 'CAR'
UNION ALL
SELECT t1.ITEM_VALUE, t1.ITEM_ABOVE, t1.DESCRIPTION, t2.ITEM_GROUP
FROM mytable t1
JOIN CTE t2 ON t1.ITEM_ABOVE = t2.ITEM_VALUE
)
SELECT ITEM_VALUE, ITEM_ABOVE, DESCRIPTION, ITEM_GROUP
FROM CTE
Related
I have this table:
select * from db_table
car city month_number
Honda Boston 1
Honda Boston 2
Honda Boston 3
Honda Boston 4
Honda Boston 5 <---data ends for Honda and Boston
Toyota Chicago 1
Toyota Chicago 2
Toyota Chicago 3
Toyota Chicago 4
Toyota Chicago 5
Toyota Chicago 6 <---data ends for Toyota and Chicago
I want to be able to self-generate data for each car and city for 24 months cycle, more like auto-increment.
What I am looking for:
car city month_number
Honda Boston 1
Honda Boston 2
Honda Boston 3
Honda Boston 4
Honda Boston 5
Honda Boston 6
Honda Boston 7
Honda Boston 8
Honda Boston 9
Honda Boston 10
Honda Boston 11
Honda Boston 12
Honda Boston 13
Honda Boston 14
Honda Boston 15
Honda Boston 16
Honda Boston 17
Honda Boston 18
Honda Boston 19
Honda Boston 20
Honda Boston 21
Honda Boston 22
Honda Boston 23
Honda Boston 24
Toyota Chicago 1
Toyota Chicago 2
Toyota Chicago 3
Toyota Chicago 4
Toyota Chicago 5
Toyota Chicago 6
Toyota Chicago 7
Toyota Chicago 8
Toyota Chicago 9
Toyota Chicago 10
Toyota Chicago 11
Toyota Chicago 12
Toyota Chicago 13
Toyota Chicago 14
Toyota Chicago 15
Toyota Chicago 16
Toyota Chicago 17
Toyota Chicago 18
Toyota Chicago 19
Toyota Chicago 20
Toyota Chicago 21
Toyota Chicago 22
Toyota Chicago 23
Toyota Chicago 24
How can I do this in postgreSQL?
You can try to use generate_series with CROSS JOIN a subquery.
Query 1:
SELECT t1.car,
t1.city,
month_number
FROM generate_series(1, 24) month_number CROSS JOIN (
select DISTINCT car,
city
from db_table
) t1
ORDER BY t1.car,t1.city
Results:
| car | city | month_number |
|--------|---------|--------------|
| Honda | Boston | 1 |
| Honda | Boston | 2 |
| Honda | Boston | 3 |
| Honda | Boston | 4 |
| Honda | Boston | 5 |
| Honda | Boston | 6 |
| Honda | Boston | 7 |
| Honda | Boston | 8 |
| Honda | Boston | 9 |
| Honda | Boston | 10 |
| Honda | Boston | 11 |
| Honda | Boston | 12 |
| Honda | Boston | 13 |
| Honda | Boston | 14 |
| Honda | Boston | 15 |
| Honda | Boston | 16 |
| Honda | Boston | 17 |
| Honda | Boston | 18 |
| Honda | Boston | 19 |
| Honda | Boston | 20 |
| Honda | Boston | 21 |
| Honda | Boston | 22 |
| Honda | Boston | 23 |
| Honda | Boston | 24 |
| Toyota | Chicago | 1 |
| Toyota | Chicago | 2 |
| Toyota | Chicago | 3 |
| Toyota | Chicago | 4 |
| Toyota | Chicago | 5 |
| Toyota | Chicago | 6 |
| Toyota | Chicago | 7 |
| Toyota | Chicago | 8 |
| Toyota | Chicago | 9 |
| Toyota | Chicago | 10 |
| Toyota | Chicago | 11 |
| Toyota | Chicago | 12 |
| Toyota | Chicago | 13 |
| Toyota | Chicago | 14 |
| Toyota | Chicago | 15 |
| Toyota | Chicago | 16 |
| Toyota | Chicago | 17 |
| Toyota | Chicago | 18 |
| Toyota | Chicago | 19 |
| Toyota | Chicago | 20 |
| Toyota | Chicago | 21 |
| Toyota | Chicago | 22 |
| Toyota | Chicago | 23 |
| Toyota | Chicago | 24 |
I am using SQL Server 2014 and I have the following T-SQL query running against a table (tbl1).
Extract of tbl1:
emp_code Name Address Company
---------------------------------------
100 Peter London ABC
125 Allan Cambridge DCE
125 Allan Cambridge DCE
115 John Suffolk ABC
115 John Suffolk XYZ
154 Mary Highlands ABC
154 Mary Bristol ABC
124 Mary Chester ABC
My T-SQL query stands as follows:
SELECT
[ID],
[Name],
[Address],
[Company],
ROW_NUMBER() OVER (PARTITION BY [emp_code] ORDER BY [Address]) AS RowNumber
FROM
[tbl1]
Output from above query:
emp_code Name Address Company RowNumber
--------------------------------------------------------
100 Peter London ABC 1
125 Allan Cambridge DCE 1
125 Allan Cambridge DCE 2
115 John Suffolk ABC 1
115 John Suffolk XYZ 2
154 Mary Highlands ABC 1
154 Mary Bristol ABC 2
154 Mary Chester ABC 3
Output I'm after:
emp_code Name Address Company RowNumber
---------------------------------------------------------
100 Peter London ABC 1
125 Allan Cambridge DCE 1
125 Allan Cambridge DCE 1
115 John Suffolk ABC 1
115 John Suffolk XYZ 1
154 Mary Highlands ABC 1
154 Mary Bristol ABC 2
154 Mary Chester ABC 3
I want my RowNumber (or change the column name if need be) to change based on the [Address] column for each [emp_code]. If the employee has the SAME address, it should have the same value (that is, 1). Else, it should give the values as in the case of employee "Mary" (above output).
I am assuming the Row_Number() function is not the right one to be used for what I'm after.
Any help would be appreciated.
I think you want DENSE_RANK here rather than ROW_NUMBER():
SELECT [ID], [Name], [Address], [Company],
DENSE_RANK() OVER (PARTITION BY [emp_code]
ORDER BY [Address]) AS DenseRank
FROM [tbl1];
Demo
Say I have a table with three columns : the first column is the id, the second contains first names and the third column contains last names. They can be rows with the same name but different last names. However, the same name cannot occur twice with the same last name twice in the table.
ID
First_Name
Last_Name
0
John
SMITH
1
John
BROWN
2
John
JONES
3
John
WILLIAMS
4
John
MILLER
5
John
DAVIS
6
John
WILSON
7
John
TAYLOR
8
John
WHITE
9
John
CLARK
10
Michael
SMITH
11
Michael
BROWN
12
James
JONES
13
James
WILLIAMS
14
Robert
MILLER
15
Robert
DAVIS
16
Robert
WILSON
17
Robert
BROWN
18
Robert
JONES
19
Robert
WILLIAMS
20
Jennifer
MILLER
21
Jennifer
DAVIS
22
Jennifer
SMITH
23
Jennifer
BROWN
24
Jennifer
JONES
25
Jennifer
WILLIAMS
26
Jennifer
WILSON
27
Jennifer
TAYLOR
28
Jennifer
WHITE
How do I get a matrix M whose rows and columns are all possible values of last names and M(f1,f2) represents the number of first names who occur with f1 and f2 in the table?
i.e to get this result
Thank you for your help
Getting a (dynamic) matrix as a result of a pure SQL is not doable.
The best you can do is to get the 2 last names in 2 columns, like this:
SELECT
t1.last_n name_a, t2.last_n name_b,
count(case when t1.first_n = t2.first_n then 1 end) count_match
FROM data_table t1,data_table t2
GROUP BY 1,2
ORDER BY 1,2
The results would look like this (this is like the expected results just not in a matrix):
Results
name_a name_b count_match
BROWN BROWN 4
BROWN CLARK 1
BROWN DAVIS 3
BROWN JONES 3
BROWN MILLER 3
BROWN SMITH 3
BROWN TAYLOR 2
BROWN WHITE 2
BROWN WILLIAMS 3
BROWN WILSON 3
CLARK BROWN 1
CLARK CLARK 1
CLARK DAVIS 1
CLARK JONES 1
CLARK MILLER 1
CLARK SMITH 1
CLARK TAYLOR 1
CLARK WHITE 1
CLARK WILLIAMS 1
CLARK WILSON 1
DAVIS BROWN 3
DAVIS CLARK 1
DAVIS DAVIS 3
DAVIS JONES 3
DAVIS MILLER 3
DAVIS SMITH 2
DAVIS TAYLOR 2
DAVIS WHITE 2
DAVIS WILLIAMS 3
DAVIS WILSON 3
JONES BROWN 3
JONES CLARK 1
JONES DAVIS 3
....
I use SQLITE (with C#) and I have a table like this:
Car PurchaseDate
Ford 2020-07-01
Audi 2020-07-31
Porsche 2020-07-31
Ford 2020-07-28
Audi 2020-07-30
Ford 2020-06-21
Ford 2020-06-21
Audi 2020-06-22
Ford 2020-06-21
Audi 2020-06-22
Porsche 2020-06-22
Ford 2020-08-01
Audi 2020-08-01
Porsche 2020-08-10
I need a SQL-query that would give me the count per Car for a given timeperiod.
(PurchaseDate is of type varchar not datetime)
So for example for the above data:
Timeperiod\PurchaseDate: 2020-06-01 - 2020-06-31
Result should be:
Ford 3
Audi 2
Porsche 1
Just use aggregation:
select car, count(*) no_cars
from mytable
where purchase_date >= '2020-06-01' and purchase_date < '2020-07-01'
group by car
I have three tables in my database Books, Borrowers and Movement:
Books
BookID Title Author Category Published
----------- ------------------------------ ------------------------- --------------- ----------
101 Ulysses James Joyce Fiction 1922-06-16
102 Huckleberry Finn Mark Twain Fiction 1884-03-24
103 The Great Gatsby F. Scott Fitzgerald Fiction 1925-06-17
104 1984 George Orwell Fiction 1949-04-19
105 War and Peace Leo Tolstoy Fiction 1869-08-01
106 Gullivers Travels Jonathan Swift Fiction 1726-07-01
107 Moby Dick Herman Melville Fiction 1851-08-01
108 Pride and Prejudice Jane Austen Fiction 1813-08-13
110 The Second World War Winston Churchill NonFiction 1953-09-01
111 Relativity Albert Einstein NonFiction 1917-01-09
112 The Right Stuff Tom Wolfe NonFiction 1979-09-07
121 Hitchhikers Guide to Galaxy Douglas Adams Humour 1975-10-27
122 Dad Is Fat Jim Gaffigan Humour 2013-03-01
131 Kick-Ass 2 Mark Millar Comic 2012-03-03
133 Beautiful Creatures: The Manga Kami Garcia Comic 2014-07-01
Borrowers
BorrowerID Name Birthday
----------- ------------------------- ----------
2 Bugs Bunny 1938-09-08
3 Homer Simpson 1992-09-09
5 Mickey Mouse 1928-02-08
7 Fred Flintstone 1960-06-09
11 Charlie Brown 1965-06-05
13 Popeye 1933-03-03
17 Donald Duck 1937-07-27
19 Mr. Magoo 1949-09-14
23 George Jetson 1948-04-08
29 SpongeBob SquarePants 1984-08-04
31 Stewie Griffin 1971-11-17
Movement
MoveID BookID BorrowerID DateOut DateIn ReturnCondition
----------- ----------- ----------- ---------- ---------- ---------------
1 131 31 2012-06-01 2013-05-24 good
2 101 23 2012-02-10 2012-03-24 good
3 102 29 2012-02-01 2012-04-01 good
4 105 7 2012-03-23 2012-05-11 good
5 103 7 2012-03-22 2012-04-22 good
6 108 7 2012-01-23 2012-02-12 good
7 112 19 2012-01-12 2012-02-10 good
8 122 11 2012-04-14 2013-05-01 poor
9 106 17 2013-01-24 2013-02-01 good
10 104 2 2013-02-24 2013-03-10 bitten
11 121 3 2013-03-01 2013-04-01 good
12 131 19 2013-04-11 2013-05-23 good
13 111 5 2013-05-22 2013-06-22 poor
14 131 2 2013-06-12 2013-07-23 bitten
15 122 23 2013-07-10 2013-08-12 good
16 107 29 2014-01-01 2014-02-14 good
17 110 7 2014-01-11 2014-02-01 good
18 105 2 2014-02-22 2014-03-02 bitten
What is a query I can use to find out which book was borrowed by the oldest borrower?
I am new to SQL and am using Microsoft SQL Server 2014
Here are two different solutions:
First using two sub querys and one equi-join:
select Title
from Books b , Movement m
where b.BookID = m.BookID and m.BorrowerID = (select BorrowerID
from Borrowers
where Birthday = (select MIN(Birthday)
from Borrowers))
Using two equi-joins and one sub query:
select Title
from Books b, Borrowers r, Movement m
where b.BookID = m.BookID
and m.BorrowerID = r.BorrowerID
and Birthday = (select MIN(Birthday) from Borrowers)
Both above queries give the following answer:
Title
------------------------------
Relativity