相关疑难解决方法(0)

获取与Oracle中的最大和最小行有关的值

在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)

(如果有两个或更多员工的薪水最高或最低,我们希望始终按字母顺序返回第一个)。

一个一篇文章讨论了如何获取值只是最大但不能同时最大值和最小值。

基于上面的链接,我们目前有一个不整洁的解决方案,然后应用后续查询,但性能对我们很重要。我预测一个好的解决方案还需要解析函数,并且可能需要一个枢纽来将多行合并为单行。

任何帮助,不胜感激!理查德

sql oracle analytic-functions oracle11g

5
推荐指数
1
解决办法
2万
查看次数

Hibernate Criteria - 返回列不同的记录

示例数据库表:

  1. ID = 1,msgFrom ='你好',foobar ='meh'
  2. ID = 2,msgFrom ='再见',foobar ='评论'
  3. ID = 3,msgFrom ='Hello',foobar ='response'

示例所需输出(由hibernate查询生成):

  1. ID = 1,msgFrom ='你好',foobar ='meh'
  2. ID = 2,msgFrom ='再见',foobar ='评论'

在上面的示例中,第三条记录将从结果中排除,因为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/

java hibernate criteria-api

5
推荐指数
1
解决办法
2万
查看次数

MySQL:ORDER BY FIELD/GROUP BY

我的问题是关于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)

mysql optimization

5
推荐指数
1
解决办法
577
查看次数

如何在连接时仅返回最新记录

我正在加入桌子。我只想根据日期字段从连接表返回一条记录。

这是我迄今为止所做的简化的小提琴: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)

sql oracle greatest-n-per-group

5
推荐指数
1
解决办法
7312
查看次数

如何获取Oracle中每个组的最大值?

我为这个问题找到了一些解决方案,但是,它们似乎不适用于 Oracle。

我懂了:

在此处输入图片说明

我想要一个视图,只显示每个团队最年长的人的信息。所以,我的输出应该是这样的:

PERSON  | TEAM | AGE
Sam     | 1    | 23
Michael | 2    | 21
Run Code Online (Sandbox Code Playgroud)

我怎样才能在 Oracle 中做到这一点?

sql oracle greatest-n-per-group

5
推荐指数
3
解决办法
2万
查看次数

Esqueleto:加入子查询(使用 subList_select)

我正在尝试将以下 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 haskell yesod esqueleto

5
推荐指数
1
解决办法
354
查看次数

检索最大/最小记录

我正在研究的一个相当复杂的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()的子查询,如上所述,这两个都不是我的问题的解决方案.

sql theory relational

4
推荐指数
2
解决办法
317
查看次数

在SQL查询中出现MAX()和`group by`的问题

我正在编写一个特别麻烦的查询.归结为:

我获得了一个结构表:

pid | tid | points
Run Code Online (Sandbox Code Playgroud)

经过一个非常大的查询.

为便于说明:

  • pid =问题ID
  • tid =团队ID
  • points =该团队因该问题而获得的分数.

我想找到为特定pid获得最高分的球队.

我的问题是双重的:

  1. 如果这是一个名字的简单表格,teampoints我怎样才能得到tid每个pid的MAX(点数)?我试过SELECT pid, tid, MAX(points) from teampoints group by pid;但可以理解,那是行不通的

  2. 经过一次相当大的查询,我得到了这个结果.如果我的第一个答案涉及teampoints再次选择数据,有没有办法做到这一点,而无需再次计算整个表?

谢谢

PS:我用的是mysql.


GORY DETAILS:小心谨慎

我的系统中有几个表,它们的相关结构是:

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 …

mysql

4
推荐指数
1
解决办法
753
查看次数

按SQL语句分组

所以我得到了这个声明,这很好:

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 t-sql sql-server group-by

4
推荐指数
1
解决办法
658
查看次数

postgres 加入最大日期

我需要构建一个联接,为我提供每种产品的最新价格。为了示例的目的,我极大地简化了表结构,每个表的行数将达到数百万。我之前在这方面的尝试并不是非常有效。

产品

价格

sql postgresql aggregate inner-join

4
推荐指数
1
解决办法
7373
查看次数