sql order by numeric string - sql

I am using oracle 10. I need to sort my result set according to two numeric string fields.
one sort criterion field holds data like this:
FIELD1:
FO-100001001001
FO-100001002001
FO-100001003001
SQ-200001003001
FC-102001003001
the other :
FIELD2:
000203
000567
349990
I need to combine the two criterion , the first criterion take the priority , the result needs an ascending order.
How do I write this sql ?

Since the numbers are zero-padded, you can simply compare them as strings:
SELECT ...
FROM ...
ORDER BY field1 ASC, field2 ASC
Or if you want to ignore the prefix in field1:
SELECT ..., SUBSTR(field1, 3) AS stripped_field1
FROM ...
ORDER BY stripped_field1 ASC, field2 ASC

I am assuming that by "numeric string", you mean "varchar", and that alpha-numeric sorting works for you (which it should if the format is fixed and you have the leading zeroes).
select * from table order by field1, field2;

Related

Need to find string using bigquery

We have below string column and having below data
and I want to find Null count present in string columns means how many times null value('') present in front of id column present in select statement
using big query.
Don't use string position.
Expected output:
count of null ('')id =3
1st row,2nd row and 5th row
Below is for BigQuery Standard SQL
#standardSQL
SELECT
FORMAT(
"count of null ('')id = %d. List of id is: %s",
COUNT(*),
STRING_AGG(CAST(ID AS STRING))
) AS output
FROM `project.dataset.table`
WHERE REGEXP_CONTAINS(String, r"(?i)''\s+(?:as|)\s+(?:id|\[id\])")
if to apply to sample data from your question - the output is
Row output
1 count of null ('')id = 3. List of id is: 1,2,5
The idea is to unify all strings to something you can query with like = "%''asid%" or regex
First replace all spaces with ''
replace "[", "]" with ''.
Make the use of " or ' consistent.
Then query with like.
For example:
select 1 from (select replace(replace(replace(replace('select "" as do, "" as [id] form table1',' ',''),'[',''),']',''),'"',"'") as tt)
where tt like ("%''asid%")
Its not a "smart" idea but its simple.
A better idea will be to save the query columns in a repeat column '"" as id' and the table in another column.
You don't need to save 'select' and 'from' this way you can query easily and also assemble a query from the data.
If I understand correctly, you want to count the number of appearances of '' in the string column.
If so, you can use regexp_extract_all():
select t.*,
(select count(*)
from unnest(regexp_extract_all(t.string, "''")) u
) as empty_string_count
from t;

Sort by Alphabets, Numbers, Special character order

SELECT * FROM details
ORDER BY cast(SUBSTRING(name,'^[a-zA-Z]+') as varchar) orderDirection NULLS LAST,
cast(SUBSTRING(name,'^\d+') as numeric) orderDirection NULLS LAST, name orderDirection;
This query retrieves data in ASC or DESC depends on the input we gave for 'orderDirection',
But the problem is Capital letters and small letters also will be treated as separate sort.
So help me in finding proper query with adding something in this query itself(Because I am using some generic codes for creating this)
Current Result:
"Came"
"Result"
"Result came"
"came"
"result"
"01 Result"
"# Result"
Expected Result:
"Came"
"came"
"Result"
"result"
"Result came"
"01 Result"
"# Result"
Get a recent PostgreSQL version that is built with a recent ICU library and create your own collation:
CREATE COLLATION english_weird (
PROVIDER = 'icu',
LOCALE = 'en-u-kr-punct-symbol-currency-digit-latn'
);
Then use it for sorting:
ORDER BY name COLLATE english_weird DESC
If you always want that order for that column, define it accordingly:
ALTER TABLE details
ALTER name TYPE text COLLATE english_weird;
If you convert the strings to lowercase before ordering you will get the results you want:
SELECT * FROM details
ORDER BY cast(SUBSTRING(LOWER(name,'^[a-z]+')) as varchar) DESC NULLS LAST,
cast(SUBSTRING(name,'^\d+') as numeric) DESC NULLS LAST,
LOWER(name) DESC;

SQL - ORDER BY Timestamp Array Data does not work

I have a table with schema as below
fields. TIME_256Hz TIMESTAMP REPEATED
fields. SAC_ACCELX FLOAT REPEATED
fields. SAC_ACCELY FLOAT REPEATED
fields. SAC_ACCELZ FLOAT REPEATED
fields. SAC_GYROX FLOAT REPEATED
fields. SAC_GYROY FLOAT REPEATED
fields. SAC_GYROZ FLOAT REPEATED
fields. SAC_PRESSURE FLOAT REPEATED
fields. TARGET STRING REPEATED
The table looks like
I try to sort the data with timestamp using this command
select * from liftpdm.liftpdm_2.acc8
order by fields.TIME_256Hz desc
BUT
I keep getting the following error:
ORDER BY does not support expressions of type ARRAY<TIMESTAMP> at [2:10]
I tried to change the Datatype to Datetime, string but same error.
Please suggest how to sort out this data
Thanks
Reproducible error:
WITH data AS (
SELECT [1,2] arr UNION ALL
SELECT [2,1] UNION ALL
SELECT [4,5,6]
)
SELECT * FROM data
ORDER BY arr
# ORDER BY does not support expressions of type ARRAY<INT64> at [8:10]
First you need to decide what do you really want to ORDER BY, as ordering by an array doesn't make much sense.
Some alternatives:
SELECT * FROM data
ORDER BY arr[SAFE_OFFSET(0)]
SELECT * FROM data
ORDER BY arr[SAFE_OFFSET(1)]
SELECT * FROM data
ORDER BY ARRAY_LENGTH(arr) DESC

Sort text field

I have the following records and need to sort them accordingly:
AB*1
AB*2
AB*10
AB*100
I am using the following SQL Statement which works perfectly, BUT only for records which are filtered to a specific criteria.
SELECT Column1
FROM dbo.Table1
ORDER BY LEN(Column1), Column1
WHERE Column1 Like 'AB*'
When I remove the Where clause in the example, the record AB*100 appears way down below. Obiously, it has grouped together all the records with the Length of 4 then it starts all over with the records with length of 5 and so on.
Is it possible to order these so all before the asterisk are grouped together and sorted correctly?
The first character "alphabetically" is actually "no character". So it's not so much that "a string of 4 comes first". For example, the following are in order...
AB*1
AB*2
AB*10
AB*100
CD*1
CD*2
CD*10
CD*100
You could order by the first 3 characters as a string, and the trailing characters as a number. Provided that's how your data behaves...
ORDER BY
LEFT(column1, 3),
CLNG(MID(column1, 4, 8000))
Or you could pad out your values and order them as if they looked like this...
AB*100
AB*10Z
AB*1ZZ
AB*2ZZ
Using this kind of ORDER BY statement...
ORDER BY
column1 & string(8000 - LEN(column1), "z")
But these are all work-arounds to force an 'un-natural' ordering, as at present you're getting the 'correct' ordering.
This is likely to be slow:
ORDER BY Mid(Column1,1,Instr(Column1,"*"))
Edit re comment
SELECT Column1
FROM Table
ORDER BY Mid([Column1],1,InStr([Column1],"*")),
Val(Mid([Column1],InStr([Column1],"*")+1));
Sample data used in test:
ID
ab*1
ab*10
ab*2
abcdef*a1
abcdef*10
abcdef*40a
For nulls, just add a few zero-length strings.
SELECT column1
FROM Table
ORDER BY Mid([column1] & "",1,InStr([column1] & "","*")),
Val(Mid([column1] & "",InStr([column1] & "","*")+1));
it seems this will do what you want, unless I misunderstand
SELECT Column1
FROM dbo.Table1
ORDER BY left(Column1,2), LEN(Column1)

Sorting data in Access database where the column has numbers and letters

Please help me because I have been unable to get this right.
What is the access SQL to select this column(columnA) so that it returns a resultset with distinct values sorted first according to numbers and then to letters.
Here is the columns values: {10A,9C,12D,11G,9B,10C,9R,8T}
I have tried 'Select distinct ColumnA from tblClass order by 1'
but it returns {10A,10C,11G,12D,8T,9B,9C,9R} which is not what I want.
Thank you in advance.
You can use the Val() function for this. From the help topic: "The Val function stops reading the string at the first character it can't recognize as part of a number"
Val(10A) will give you 10, Val(9C) will give you 9, and so on. So in your query, order by Val(ColumnA) first, then ColumnA.
SELECT DISTINCT Val([ColumnA]) AS number_part, ColumnA
FROM tblClass
ORDER BY Val([ColumnA]), ColumnA;
SELECT DISTINCT ColumnA
FROM tblClass
ORDER BY CInt(LEFT(ColumnA,len(ColumnA)-1)), RIGHT(ColumnA,1);
If there last character is a letter and the others are a number.
Your data type is a string so it's sorting correctly, to get the result you want you're going to have to split your values into numeric and alphabetic parts and then sort first on the numeric then the alphabetic. Not being an Access programmer I can't help you with exactly how you're going to do that.
order by 1?
Don't you mean order by ColumnA?
SELECT DISTINCT ColumnA
FROM tblClass
ORDER BY ColumnA
I had a similar problem and used a dummie workaround:
changing a list of {10A,10C,11G,12D,8T,9B,9C,9R}
into {10A,10C,11G,12D,08T,09B,09C,09R} by adding the 0 before each <10 number.
now all items are the same length and access will sort correctly into {08T, 09B, 09C, 09R, 10A, 10C, 11G, 12D}
.
To achieve this, I copied this column into excel column A and used IF(LEN(A2)<3, concatenate("0", A2))