在Oracle 11g中,我们需要能够查询表以从特定组中具有最高和最低值的行中提取信息。例如,使用EMP表,我们想要找到每个部门中薪水最高的人的名字和薪水最低的人的名字
DEPTNO MAX_SAL MAX_EARNER MIN_SAL MIN_EARNER
-------------------------------------------------------
10 5000 KING 1300 MILLER
20 3000 FORD 2975 JONES
etc
Run Code Online (Sandbox Code Playgroud)
(如果有两个或更多员工的薪水最高或最低,我们希望始终按字母顺序返回第一个)。
一个一篇文章讨论了如何获取值只是最大但不能同时最大值和最小值。
基于上面的链接,我们目前有一个不整洁的解决方案,然后应用后续查询,但性能对我们很重要。我预测一个好的解决方案还需要解析函数,并且可能需要一个枢纽来将多行合并为单行。
任何帮助,不胜感激!理查德
示例数据库表:
示例所需输出(由hibernate查询生成):
在上面的示例中,第三条记录将从结果中排除,因为msgFrom列是相同的.假设Java/Hibernate类叫做Message.我希望结果作为Message对象列表(或者可以转换为Message的对象)返回.我想尽可能使用Criteria API.我在SO上看到了这个例子,看起来很相似,但我还没有正确实现它.
select e from Message e
where e.msgFrom IN (select distinct m.msgFrom
from Message m
WHERE m.msgTo = ?
AND m.msgCheck = 0");
Run Code Online (Sandbox Code Playgroud)
我这样做的原因是要对数据库上的不同记录进行过滤,所以我对我必须在应用程序服务器上过滤任何内容的答案不感兴趣.
编辑:文章基本上显示了我想要做的事情.http://oscarvalles.wordpress.com/2008/01/28/sql-distinct-on-one-column-only/
我的问题是关于MySQL优化和良好实践.
我必须得到带有订单偏好的翻译文本列表:如果我找不到英文文本,我想使用法文文本,如果它不存在,我想用西班牙语.
换句话说,我有:
id lang text
1 fr text_FR
1 en text_EN
1 es text_ES
2 fr text_FR2
3 fr text_FR3
3 es text_ES3
Run Code Online (Sandbox Code Playgroud)
而且我要:
id lang text
1 en text_EN
2 fr text_FR2
3 fr text_FR3
Run Code Online (Sandbox Code Playgroud)
所以我读了一些像这样,这个,那个或那个的主题.好.我试过这个:
SELECT text FROM (
SELECT id, text
FROM translation
ORDER BY FIELD(lang, 'en', 'fr', 'es')
) tt GROUP BY tt.id;
Run Code Online (Sandbox Code Playgroud)
但是,当我解释这个查询时,我可以读到:
id select_type table partitions type possible_keys key key_len ref rows Extra
1 PRIMARY …
Run Code Online (Sandbox Code Playgroud) 我正在加入桌子。我只想根据日期字段从连接表返回一条记录。
这是我迄今为止所做的简化的小提琴:http://sqlfiddle.com/#!3/be0cdd/ 2
我的桌子:
CUSTOMER
| CustomerID |
--------------
| 1 |
PURCHASE
| PurchaseID | CustomerID | ProductID | CreateDate | ArchiveFlag |
------------------------------------------------------------------
| 1 | 1 | 443 | 01-FEB-15 | F |
| 2 | 1 | 551 | 01-MAR-15 | F |
| 3 | 1 | 151 | 01-JAN-15 | F |
| 4 | 1 | 654 | 01-MAY-15 | T |
| 5 | 1 | 345 | 01-APR-15 | T …
Run Code Online (Sandbox Code Playgroud) 我为这个问题找到了一些解决方案,但是,它们似乎不适用于 Oracle。
我懂了:
我想要一个视图,只显示每个团队最年长的人的信息。所以,我的输出应该是这样的:
PERSON | TEAM | AGE
Sam | 1 | 23
Michael | 2 | 21
Run Code Online (Sandbox Code Playgroud)
我怎样才能在 Oracle 中做到这一点?
我正在尝试将以下 SQL 转换为 Esqueleto:
SELECT id, task_id, author_id
FROM scenario
INNER JOIN ( SELECT task_id as tId, author_id as aId, MAX(last_update) as lastUp
FROM scenario
GROUP BY task_id, author_id
) t
ON task_id = tId AND author_id = aId AND last_update = lastUp
Run Code Online (Sandbox Code Playgroud)
要进行子查询,您必须使用subList_select。
我想不出将它与以下模式匹配相结合的方法:
from $ \(s `InnerJoin` ?subQueryhere?) -> do ...
Run Code Online (Sandbox Code Playgroud)
所以我尝试使用where_
:
where_ (s ^. ScenarioTaskId ==. (subList_select $
from $ \s' -> do
groupBy (s' ^. ScenarioTaskId, s' ^. ScenarioAuthorId)
return s'
) …
Run Code Online (Sandbox Code Playgroud) 我正在研究的一个相当复杂的SQL查询让我思考(ANSI)SQL的局限性:
有没有办法检索关于任意排序的最大或最小记录?
换一种说法:
给出这样的查询:
SELECT * FROM mytable WHERE <various conditions> ORDER BY <order clause>
Run Code Online (Sandbox Code Playgroud)
是否可以编写一个只返回第一行的查询(可能通过将order子句转换为其他内容)?
我知道你可以使用LIMIT(MySQL)/ ROWNUM(Oracle)或类似的方法来做到这一点,但这不是标准的SQL.
我也知道你可以通过在子查询中获取你感兴趣的最大/最小值(使用MIN()/ MAX())来做到这一点,然后在主SELECT中使用该结果作为标准,即:
SELECT * FROM mytable WHERE <various conditions> AND myMaxColumn=(
SELECT MAX(myMaxColumn) FROM mytable WHERE <various conditions>
)
Run Code Online (Sandbox Code Playgroud)
但这只有在我想按单列排序时才有效.我认为没有办法将它推广到多个列(除了嵌套上面的解决方案,但这意味着当用n coluns排序时有2 ^ n个SELECT).
那么标准SQL中有一种比嵌套多个子选择更好的方法吗?
在创建SQL查询中询问相关问题以检索最近的记录.但是,那里的答案建议使用LIMIT和朋友,或使用带有MAX()的子查询,如上所述,这两个都不是我的问题的解决方案.
我正在编写一个特别麻烦的查询.归结为:
我获得了一个结构表:
pid | tid | points
Run Code Online (Sandbox Code Playgroud)
经过一个非常大的查询.
为便于说明:
pid
=问题IDtid
=团队IDpoints
=该团队因该问题而获得的分数.我想找到为特定pid获得最高分的球队.
我的问题是双重的:
如果这是一个名字的简单表格,teampoints
我怎样才能得到tid
每个pid的MAX(点数)?我试过SELECT pid, tid, MAX(points) from teampoints group by pid;
但可以理解,那是行不通的
经过一次相当大的查询,我得到了这个结果.如果我的第一个答案涉及teampoints
再次选择数据,有没有办法做到这一点,而无需再次计算整个表?
谢谢
PS:我用的是mysql.
我的系统中有几个表,它们的相关结构是:
users: uid
teams: tid | eid | teamname
teammembers: tid | uid
events: eid
problems: pid | eid
submissions: subid | pid | uid | eid | points | subts
Run Code Online (Sandbox Code Playgroud)
一些注意事项: - 问题属于事件 - 用户属于团队 - 提交属于问题(pid)和用户(uid).提交表有一个冗余的eid字段,它总是可以从pid中确定.
用例是:
uid …
所以我得到了这个声明,这很好:
SELECT MAX(patient_history_date_bio) AS med_date, medication_name
FROM biological
WHERE patient_id = 12)
GROUP BY medication_name
Run Code Online (Sandbox Code Playgroud)
但是,我想也有相应的药物_dose.所以我输入了这个
SELECT MAX(patient_history_date_bio) AS med_date, medication_name, medication_dose
FROM biological
WHERE (patient_id = 12)
GROUP BY medication_name
Run Code Online (Sandbox Code Playgroud)
但是,它给我一个错误说:
"coumn'biimal.medication_dose'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中."
所以我尝试将GMB_dose添加到GROUP BY子句中,但是它给了我额外的行,我不想要.我想在我的桌子上获得每种药物的最新行.(最新行由max函数确定,获取最新日期).
我该如何解决这个问题?
sql ×7
oracle ×3
mysql ×2
aggregate ×1
criteria-api ×1
esqueleto ×1
group-by ×1
haskell ×1
hibernate ×1
inner-join ×1
java ×1
optimization ×1
oracle11g ×1
postgresql ×1
relational ×1
sql-server ×1
t-sql ×1
theory ×1
yesod ×1