获取非重复记录的最大值
get max value of non duplicated records
这可能吗?
我有以下 table:
Col1
Col2
col3
code1
US
9
code1
0
5
code2
US
4
code2
0
11
code3
0
11
我正在尝试通过 col1 和 col2 过滤更高的 col3 值我现在的尝试是:
SELECT MAX(col3), col2, col1, count(col1) FROM `mytable` WHERE (col1 IN ('code1', 'code2') ) AND ((col2 = 'US') OR (col2 = '0')) GROUP BY col1;
我的结果:
Col1
Col2
col3
count(col1)
code1
US
9
2
code2
0
11
2
但我需要的是,如果两个代码都有一个值等于 'US' 的 col2,那么 return 中更高的 col3 值,并忽略带有“0”的那些
Col1
Col2
col3
count(col1)
code1
US
9
2
或者如果其中一个代码只有一行,col2 等于“0”,则比较 code1 = 'US' 和 code2 =“0”
Col1
Col2
col3
code1
US
9
code1
0
5
code2
0
11
code3
0
11
给出结果:
Col1
Col2
col3
count(col1)
code2
0
11
2
是否可以通过 mysql 查询来实现?或者我应该使用 php?
提前致谢。
您有非常具体的 where 子句,因此您需要像在 Main Select
中一样在子选择中重复它们
随着您的需求越来越复杂,您必须增加subselect的数量来满足您的要求,ORDER BYs决定被选中的行。
Followimg 为您提供结果,随着您添加越来越多的 obsticles,您也必须在代码中执行此操作
CREATE TABLE tab1 (
`Col1` VARCHAR(5),
`Col2` VARCHAR(2),
`col3` INTEGER
);
INSERT INTO tab1
(`Col1`, `Col2`, `col3`)
VALUES
('code1', 'US', '9'),
('code1', '0', '5'),
('code2', 'US', '4'),
('code2', '0', '11'),
('code3', '0', '11');
SELECT * FROM tab1 WHERE col3 =
(SELECT MAX(col3) FROM tab1 WHERE (col1 IN ('code1', 'code2') ) AND ((col2 = 'US') OR (col2 = '0')))
AND (col1 IN ('code1', 'code2') ) AND ((col2 = 'US') OR (col2 = '0'))
ORDER BY col1,col2 DESC
LIMIT 1
Col1 | Col2 | col3
:---- | :--- | ---:
code2 | 0 | 11
SELECT
col1,col2,col3
FROM
(SELECT
`Col1`, `Col2`, `col3`,
ROW_NUMBER() OVER(ORDER BY col2 DESC,col3 DESC) rn2
FROM(
SELECT
* ,ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col3 DESC) rn
FROM tab1) t1
WHERE rn = 1) t2
WHERE rn2 = 1
col1 | col2 | col3
:---- | :--- | ---:
code1 | US | 9
CREATE TABLE tab2 (
`Col1` VARCHAR(5),
`Col2` VARCHAR(2),
`col3` INTEGER
);
INSERT INTO tab2
(`Col1`, `Col2`, `col3`)
VALUES
('code1', '0', '5'),
('code2', 'US', '4'),
('code2', '0', '11'),
('code3', '0', '11');
SELECT
col1,col2,col3
FROM
(SELECT
`Col1`, `Col2`, `col3`,
ROW_NUMBER() OVER(ORDER BY col2 DESC,col3 DESC) rn2
FROM(
SELECT
* ,ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col3 DESC) rn
FROM tab2) t1
WHERE rn = 1) t2
WHERE rn2 = 1
col1 | col2 | col3
:---- | :--- | ---:
code2 | 0 | 11
db<>fiddle here
这可能吗? 我有以下 table:
Col1 | Col2 | col3 |
---|---|---|
code1 | US | 9 |
code1 | 0 | 5 |
code2 | US | 4 |
code2 | 0 | 11 |
code3 | 0 | 11 |
我正在尝试通过 col1 和 col2 过滤更高的 col3 值我现在的尝试是:
SELECT MAX(col3), col2, col1, count(col1) FROM `mytable` WHERE (col1 IN ('code1', 'code2') ) AND ((col2 = 'US') OR (col2 = '0')) GROUP BY col1;
我的结果:
Col1 | Col2 | col3 | count(col1) |
---|---|---|---|
code1 | US | 9 | 2 |
code2 | 0 | 11 | 2 |
但我需要的是,如果两个代码都有一个值等于 'US' 的 col2,那么 return 中更高的 col3 值,并忽略带有“0”的那些
Col1 | Col2 | col3 | count(col1) |
---|---|---|---|
code1 | US | 9 | 2 |
或者如果其中一个代码只有一行,col2 等于“0”,则比较 code1 = 'US' 和 code2 =“0”
Col1 | Col2 | col3 |
---|---|---|
code1 | US | 9 |
code1 | 0 | 5 |
code2 | 0 | 11 |
code3 | 0 | 11 |
给出结果:
Col1 | Col2 | col3 | count(col1) |
---|---|---|---|
code2 | 0 | 11 | 2 |
是否可以通过 mysql 查询来实现?或者我应该使用 php?
提前致谢。
您有非常具体的 where 子句,因此您需要像在 Main Select
中一样在子选择中重复它们随着您的需求越来越复杂,您必须增加subselect的数量来满足您的要求,ORDER BYs决定被选中的行。
Followimg 为您提供结果,随着您添加越来越多的 obsticles,您也必须在代码中执行此操作
CREATE TABLE tab1 ( `Col1` VARCHAR(5), `Col2` VARCHAR(2), `col3` INTEGER ); INSERT INTO tab1 (`Col1`, `Col2`, `col3`) VALUES ('code1', 'US', '9'), ('code1', '0', '5'), ('code2', 'US', '4'), ('code2', '0', '11'), ('code3', '0', '11');
SELECT * FROM tab1 WHERE col3 = (SELECT MAX(col3) FROM tab1 WHERE (col1 IN ('code1', 'code2') ) AND ((col2 = 'US') OR (col2 = '0'))) AND (col1 IN ('code1', 'code2') ) AND ((col2 = 'US') OR (col2 = '0')) ORDER BY col1,col2 DESC LIMIT 1
Col1 | Col2 | col3 :---- | :--- | ---: code2 | 0 | 11
SELECT col1,col2,col3 FROM (SELECT `Col1`, `Col2`, `col3`, ROW_NUMBER() OVER(ORDER BY col2 DESC,col3 DESC) rn2 FROM( SELECT * ,ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col3 DESC) rn FROM tab1) t1 WHERE rn = 1) t2 WHERE rn2 = 1
col1 | col2 | col3 :---- | :--- | ---: code1 | US | 9
CREATE TABLE tab2 ( `Col1` VARCHAR(5), `Col2` VARCHAR(2), `col3` INTEGER ); INSERT INTO tab2 (`Col1`, `Col2`, `col3`) VALUES ('code1', '0', '5'), ('code2', 'US', '4'), ('code2', '0', '11'), ('code3', '0', '11');
SELECT col1,col2,col3 FROM (SELECT `Col1`, `Col2`, `col3`, ROW_NUMBER() OVER(ORDER BY col2 DESC,col3 DESC) rn2 FROM( SELECT * ,ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col3 DESC) rn FROM tab2) t1 WHERE rn = 1) t2 WHERE rn2 = 1
col1 | col2 | col3 :---- | :--- | ---: code2 | 0 | 11
db<>fiddle here